In mvc most of the people will face problem how to bind view model list while post request. If a partial control is binding with a list and want to preserve the user input with view model list, most common issue is id/name is same. If the Id/Name are different only MVC engine can bind it with the model.
Please see the below example
Build the view/partial view in the following way. By keeping a row counter means all items will have unique names.
Suppose this partial view is coming inside a View Called MethodName.ASPX and is included inside the
using html.beginform()
[httpGet]
{
<%html.dropdownlist(model=>model.Test, new {onclick=Test(<%=model.Id%>);});
<.div id="dvPopulatePartialViewWithList"></.div>
Please see the below example
Build the view/partial view in the following way. By keeping a row counter means all items will have unique names.
Suppose this partial view is coming inside a View Called MethodName.ASPX and is included inside the
Main Page
using html.beginform()
[httpGet]
{
<%html.dropdownlist(model=>model.Test, new {onclick=Test(<%=model.Id%>);});
}
Javascript function Test
function Test(id)
{
$.ajax({
type: "Get",
data: "Id=" + Id,
url: '/MyController/GetPartialViewListById',
success: function (result) {
$('#dvPopulatePartialViewWithList').html(result);
}
});
}
Controller Method
public actionresult GetPartialViewListById(int Id)
{
try
{
List list=GetListById(Id);
return renderPartial("MyPartialView",list);
}
catch(Exception ex)
{
throw new exception("error",ex);
}
}
PartialView MyPartialView
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl
- >" %>
<%@ Import Namespace="External_ViewModel" %>
<% int rowCounter = 0; //Keep track of unique value for binding to model list
%>
<%
foreach (var model in Model)
{
<%: Html.ValidationSummary(true)%>
<%: Html.Hidden("[" + rowCounter + "].Id", model.Id)%>
<%: Html.Hidden("[" + rowCounter + "].Name", Model.Name)%>
<%= model.nameOfItem%>
[
<%= cav.Item%>
]
<%: Html.TextBox("[" + rowCounter + "].Value", model.Value, new { Style = "width:140px;" })%>
<%: Html.ValidationMessage("[" + rowCounter + "].Value", model.Value)%>
<% ++rowCounter;
} //end foreach Loop
%>
In Controller create the action like this
[httpPost]
public ActionResult MethodName(ViewModel model, List resultList)
{
// when you submit the form resultList will have binded values
}
Comments
Post a Comment