【问题标题】:How to bind a List of ViewModel in ASP MVC?如何在 ASP MVC 中绑定 ViewModel 列表?
【发布时间】:2013-05-21 01:35:58
【问题描述】:

有谁知道如何获取下面的 MODELVIEW 模式的 POST 值。我可以将 MenuItem 显示为复选框和单选按钮, 但是当用户提交表单即 POST 时,ModelViewTest 为空。我期待用户选择的菜单项列表。

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

动作:

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 类:

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

更新

请看下面我的查看代码sn-p:

<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>

【问题讨论】:

  • 您的视图代码是什么 - 另请注意,如果您包含模型,您在 post 操作中返回的视图只会包含您提交的数据 - 即 return View(model);
  • 请贴出 MenuItem 和 Resturant 类的代码
  • 嗨 Muhammad 我已经添加了 MenuItem 和餐厅类。请记住,我只是在补课。实际的类要复杂得多。我正在尝试先整理基本内容。
  • 什么是“ModelView”模式?你的意思是“ViewModel”模式吗?
  • 是的,ViewModel 你知道如何解决我的问题吗?

标签: asp.net-mvc


【解决方案1】:

为了在 POST 操作中获取菜单项列表,您需要它们的对应值必须包含在 html &lt;form&gt; 中,并且因为这是一个集合,请遵循 standard naming convention,以便默认模型绑定器可以解析它们.

【讨论】:

  • 查看了链接,但我仍然不明白如何在 POST 上捕获动态的收音机组和复选框。我在原始问题上添加了 MenuItem 和 Restaurant 的类
【解决方案2】:

首先,您应该向我们展示您的视图,以了解您如何渲染您的 ViewModel。 不过试试这个:

将部分视图作为MenyItem 的编辑器模板

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

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

那么在你看来,让 for 循环不是 foreach:

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

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

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

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

    <% } %>
<% } %>

请看answer

【讨论】:

  • 它不适用于我的场景,如果我们为每个复选框或单选按钮添加 i,则该组将不起作用。我需要根据“UIGroupType”对每个复选框和单选按钮进行分组。例如GroupType 可以是甜点或午餐或晚餐。
【解决方案3】:

请看下面我的查看代码sn-p:

<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多