Nil Pun
Nil Pun

Reputation: 17373

How to bind a List of ViewModel in ASP MVC?

Does anyone know how to get POST values for MODELVIEW Pattern below. I can display the MenuItem as Checkboxes and Radio buttons, but when user submits the form i.e. POST, ModelViewTest is null. I'm expecting List of MenuItems that user have selected.

public class ModelViewTest
{
    public IEnumerable<MenuItem> MenuItemList { get; set; } //Will be displayed as listboxes and checkboxes
    public Restaurant restaurant {get;set;}
}

ACTIONS:

public ActionResult Edit()
{
     //some code here
     }
     return View(new ModelViewTest());
}

[HttpPost]
public ActionResult Edit(ModelViewTest model)
{
    //I'm not getting List of MenuItems

    return View();
}

MenuItem Class:

public class MenuItem
{
    public string MenuItemCode{get;set;}
    public string MenuItemDescription{get;set;}
    public string UIType {get;set;} //This determines whether it's radio or checkbox
    public string UIGroupType {get;set;} //Determines the Group for radio/checkbox.
}

public class Restaurant
{
    public string restaurantName{get;set;}
    public MenuItem MenuItem{get;set;}
}

Update

Please see my View code snippet below:

<table>                                
    @foreach (var menu in Model.MenuList)
    {
        if (menu.UIType == "Radio")
        {
            <tr>
                <td align="left">
                    <input id="MenuCheckboxRadio" name="@Menus.UIGroup" value="@Menu.MenuItemCode"  type="radio" />
                    <label>@Menu.MenuItemDescription</label>
                </td>
            </tr>              
        }
        else
        {
            <tr>
                <td align="left">
                    <input id="MenuCheckbox" name="@Menus.UIGroup" value="@Menus.@MenuItem" type="checkbox" />
                    <label>@Menu.MenuItemDescription</label>
                </td>
            </tr>
        }
        i++;
    }
</table>

Upvotes: 0

Views: 1769

Answers (3)

Nil Pun
Nil Pun

Reputation: 17373

Please see my View code snippet below:

<table>
    @foreach (var menu in Model.MenuList)
    {
        if (menu.UIType == "Radio")
        {
        <tr>
            <td align="left">
                <input id="MenuCheckboxRadio" name="@Menus.UIGroup" value="@Menu.MenuItemCode"  type="radio" />
                <label>@Menu.MenuItemDescription</label>

            </td>
        </tr>              
        }
        else
        {
        <tr>
            <td align="left">
                <input id="MenuCheckbox" name="@Menus.UIGroup" value="@Menus.@MenuItem" type="checkbox" />
                <label>@Menu.MenuItemDescription</label>


            </td>
        </tr>

        }
        i++;
    }
</table>

Upvotes: 0

Wahid Bitar
Wahid Bitar

Reputation: 14094

First you should show us your view to know how you render your ViewModel. However try this:

make partial view to be editor template for your MenyItem

<%@ Control Inherits="ViewUserControl<MenyItem>" %>

<%: Html.TextBoxFor(m => m.MenuItemCode) %>
<%: Html.TextBoxFor(m => m.MenuItemDescription) %>
.......

then in your view make for loop NOT foreach:

    <%@ Page Inherits="ViewPage<ModelViewTest>" %>

    <% using (Html.BeginForm()) {%>

    <% for (int i = 0; i < 3; i++) { %>

      <%: Html.EditorFor(m => m.MenuItemList[i]) %>

    <% } %>
<% } %>

And please see this answer

Upvotes: 1

Darin Dimitrov
Darin Dimitrov

Reputation: 1038950

In order to get the list of menu items in the POST action you need their corresponding values must be included in the html <form> and because this is a collection follow the standard naming convention so that the default model binder can parse them.

Upvotes: 2

Related Questions