обрабатывать несколько элементов управления с одинаковым именем в коллекции форм

У меня есть форма в моем приложении asp.net mvc(C#), которая обрабатывает некоторые динамические элементы управления.

При нажатии кнопки «Добавить строку» я динамически добавлю строку в существующую таблицу как:

$('#btnAddMore').click(function() {
    var _userBodyHtml = '';
    _userBodyHtml += '<tr><td><input type="text" name="UserName" id="UserName' + _userDynId + '" size="10" /></td>';
    _userBodyHtml += '<td><textarea name="UserComments" id="UserComments' + _userDynId + '" cols="60" rows="1"></textarea></td>';
    _userBodyHtml += '</tr>';
    _userDynId += 1;
    $('#UserBody').append(_userBodyHtml);
});

Затем администратор добавляет имя пользователя и комментарии и отправляет их.

При отправке я обрабатываю это в действии контроллера как:

var _frmUserNames = new List<String>(form["UserName"].ToString().Split(','));
var _frmUserComments = new List<String>(form["UserComments"].ToString().Split(','));
if (_frmUserNames.Count > 0 && _frmUserComments.Count > 0)
{
    List<UserComments> _userComments = Enumerable.Range(0, _frmUserNames.Count)
        .Select(i => new UserComments
        {
            UserName = _frmUserNames[i],
            UserComment = _frmUserComments[i]
        }).ToList();
}

Из приведенного выше кода _frmUserComments возвращает значение, разделенное запятыми, когда существует более одного текстового поля с одинаковым именем, поскольку я различаю текстовые поля только с разными идентификаторами.

Проблема заключается в том, что когда администратор вводит пользовательские комментарии, в которых есть запятая (,) внутри этого комментария, тогда значение формы _frmUserComments имеет значение, разделенное запятыми, и это дает неверные данные в список.

Когда входит администратор (случай 1), что нормально:

Sam          Logged on 12/10/2010
David        Looking for enhancement

значения формы возвращаются:

_frmUserNames  = "Sam,David"
_frmUserComments = "Logged on 12/10/2010,Looking for enhancement"

Когда входит администратор (случай 2), что вызывает проблему:

Sam          Logged on 12/10/2010
David        Logged on 03/01/2011, Looking for enhancement

значения формы возвращаются:

_frmUserNames  = "Sam,David"
_frmUserComments = "Logged on 12/10/2010,Logged on 03/01/2011, Looking for enhancement"

Как я могу справиться с таким сценарием.


person Prasad    schedule 29.04.2011    source источник


Ответы (2)


Попробуйте установить атрибуты имен динамических элементов управления такими же, как идентификаторы (с индексом - ваш _userDynId). Вы сможете перебирать коллекцию форм в контроллере, что-то вроде этого (используя LINQ):

        foreach (var key in form.AllKeys.Where(k => k.StartsWith("UserName")))
        {
            var index = key.Replace("UserName", "");
            var userName = form[key];
            var userComment = form["UserComments" + index];
        }
person Azargoth    schedule 29.04.2011

Похоже, вы хотите привязать коллекцию к модели. Я рекомендую сделать это так, как это делает Фил Хаак

person xelibrion    schedule 10.05.2011