Today, I came across a situation where I had to display a list of combo boxes inside a part of a complicated tab based form. The model of the view was a different object than this particular section I was trying to render. I had a different controller action to do the updates.
After Googling, I came across this article from Scott - ASP.NET Wire Format for Model Binding to Arrays, Lists, Collections, Dictionaries which turned out to be very helpful.
While implementing this all I need the binder to return something like a dictionary
of int
key with int
value.
[HttpPost]
public ActionResult EditProjectAccess(int? id, Dictionary<int, int> ProjectAccess)
{
}
So in my View, I used the following snippet:
Var counter = 0;
foreach (var item in ProductGroups)
{
<fieldset>
<legend>@item.GroupName</legend>@foreach (var pj in item.Products)
{
<dl>
<dt>@pj.Name:</dt>
<dd class="text"> @if (Model.ResourceId
==
pj.ProjectManagerId)
{
<text><strong>Project
Manager</strong></text> }
else {
@Html.Hidden("ProjectAccess[" + counter + "].key", pj.ProductId)
@(Html.DropDownList("ProjectAccess[" + counter + "].value",
new SelectList(new List<Object>{
new { value = "0″ , text = "No Access" },
new { value = "1″ , text = "Participant" },
}, "value", "text", pj.HasAccess(Model.ResourceId)?0:1))) counter++;
}
</dd> </dl> }
</fieldset>}
The key here was using the Hidden field for storing the key name, and the combo box for the value field. One thing though the counter values should be incremental, i.e., no gaps in sequence. Else on the model you will only get up to the sequenced item.
So now, I can easily get access to my dictionary list and figure what each of those combo values was selected to. The key can be string
as well and the value can be complex object. Just follow Scott’s blog article.