asp.net - MVC 4 模型返回 null

标签 asp.net asp.net-mvc asp.net-mvc-4 razor

因此,我有一个 View ,需要传入和传出几个不同的对象和对象列表,我已为其创建了 View 模型。我的 View 模型看起来像这样

public class EditUserViewModel
{
    public ManageUsersViewModel ManageUsersViewModel { get; set; }
    public IEnumerable<StateModel> StateModel { get; set; }
}

我遇到问题的部分是 StateModel,它看起来像这样

public class StateModel
{
    public bool IsChecked { get; set; }
    public States States { get; set; }
    public UsersInStates UsersInStates { get; set; }
}

并且包含这个

[Table("States")]
public class States
{
    [Key]
    public int StateId { get; set; }
    public string State { get; set; }
}

[Table("UsersInStates")]
public class UsersInStates
{
    [Key, Column(Order = 1)]
    public int UserId { get; set; }
    [Key, Column(Order = 2)]
    public int StateId { get; set; }
    public string LicenseNumber { get; set; }
}

在我看来,我或多或少地尝试循环遍历状态并为 UsersInStates 获取用户输入。这就是我试图完成它的方式,但我的整个 StateModel 返回 null。进入 View ,StateModel.States 有数据,而 UsersInStates 没有。这就是我看来的样子

@foreach (var state in Model.StateModel)
{
    @Html.HiddenFor(m => state)
    <tr>
        <td>
            @Html.CheckBoxFor(m => state.IsChecked)
        </td>
        <td>
            @Html.Label(state.States.State)
        </td>
        <td>
            @Html.EditorFor(m => state.UsersInStates.LicenseNumber)
        </td>
    </tr>
}

如有任何建议,我们将不胜感激。一切都按其应有的方式显示,并且 ManageUsersViewModel 部分工作正常,只是返回 Controller 的 StateModel 数据为空,我不确定如何使其按照我希望的方式工作。

这就是根据请求生成的表格开头和第一行的 html 的样子

<table style="margin-left:auto; margin-right:auto; text-align:center">
<input id="state" name="state" type="hidden" value="WebSiteNew.Models.StateModel" />                    <tr>
                <td>
                    <input data-val="true" data-val-required="The IsChecked field is     required." id="state_IsChecked" name="state.IsChecked" type="checkbox" value="true" />    <input name="state.IsChecked" type="hidden" value="false" />
                </td>
                <td>
                    <label for="Alabama">Alabama</label>
                </td>
                <td>
                    <input class="text-box single-line" id="state_UsersInStates_LicenseNumber" name="state.UsersInStates.LicenseNumber" type="text" value="" />
                </td>
            </tr>

答案:

好的,为了解决这个问题,我使用了 for 循环,如下面答案中列出的两个引用文献中所解释的那样

@for (int i = 0; i < Model.StateModel.Count(); i++)
{
    <tr>
        <td>
            @Html.HiddenFor(m => m.StateModel[i].States.StateId)
            @Html.HiddenFor(m => m.StateModel[i].States.State)
            @Html.CheckBoxFor(m => m.StateModel[i].IsChecked)
        </td>
        <td>
            @Html.Label(Model.StateModel[i].States.State)
        </td>
        <td>
            @Html.EditorFor(m => m.StateModel[i].UsersInStates.LicenseNumber)
        </td>
    </tr>
}

还请注意,我必须将 EditUsersViewModel 中的 IEnumerable 更改为 IList 以允许建立索引。

最佳答案

所以你的问题是模型绑定(bind)没有正确发生。

假设您有这两个模型:

public class ParentModel
{
    public string Name {get;set;}
    public ChildModel Child {get;set;}
}

public class ChildModel
{
    public string ChildName {get;set;}
    public int SomeNumber {get;set;}
}

您生成的 HTML(为了使模型绑定(bind)正确发生)需要如下所示:

<input name="Name" value="(Not relevant to this example)"/>
<input name="Child.ChildName" value="(Not relevant to this example)" />

请注意名称字段的结构 - 这是 MVC 如何确定哪些输入值映射到 View 模型中的哪些属性。对于嵌套属性,属性名称必须位于其前面。

对于集合,事情会变得更加复杂。模型绑定(bind)器需要知道哪些值与属性的哪个实例对应。

例如,如果我们假设上一个示例中的 ChildModel 的类型为 IEnumerable,则您的 HTML 可能如下所示,以便正确建模绑定(bind):

<input name="Name" value="(Not relevant to this example)"/>
<input name="Child[0].ChildName" value="(Not relevant to this example)" />
<input name="Child[0].SomeNumber" value="(Not relevant to this example)"/>
<input name="Child[1].ChildName" value="(Not relevant to this example)" />
<input name="Child[1].SomeNumber" value="(Not relevant to this example)"/>

看看这些如何修复它:

http://seesharpdeveloper.blogspot.com/2012/05/mvc-model-binding-to-list-of-complex.html http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx

编辑 - 还需要注意的是,当 Html Helpers 生成名称值时,它基于传入的 lambda 值。因此

@Html.CheckBoxFor(m => state.IsChecked)

将生成以下名称

name="state.IsChecked"

由于您位于 foreach 中,因此您获得的名称值是错误的。

关于asp.net - MVC 4 模型返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16524523/

相关文章:

mysql - ASP.Net 无法加载文件或程序集 MySql.Data

ASP.Net session 变量——设置 session 变量然后重定向

javascript - 使用ScriptBundle可以调试吗?

asp.net-mvc - NuGet将恶意行添加到web.config MVC4

javascript - 为什么仅针对我所在的当前页面选中复选框

c# - 如何在 String.Format 下显示指数?

css - 使用 asp.net 标签设置 css 类

jquery - MVC 自定义验证 : compare two dates

javascript - 当屏幕中的某些内容发生更改时启用按钮

javascript - 如何在 MVC 中发布后保留 DropDown 的值