Question

I have a form in my asp.net mvc(C#) application which handles some dynamic controls.

On a button click "Add Row", i will add a row dynamically to the existing table as:

$('#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);
});

Then the admin adds the username and comments and submits it.

On submit, i am handling it in controller's action as:

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();
}

From the above code, the _frmUserComments returns the comma separated value when there are more than one textbox with the same name as i am differentiating the textboxes only with different ids.

The problem is when the admin enters the usercomments which has a comma(,) within that comment, then the form value _frmUserComments has the comma separated value and it gives invalid data to the List.

When Admin enters(Case 1) which is fine:

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

the form values returns:

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

When Admin enters(Case 2) which is problem causing:

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

the form values returns:

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

How can i handle the scenario like this.

Was it helpful?

Solution

Try to set dynamic controls name attributes same as IDs (with index - yours's _userDynId). You'll be able to iterate through form collection in controller, something like that (using 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];
        }

OTHER TIPS

Looks like you want to bind collection to model. I recommend to do it as Phil Haack does

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top