加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net – MVC 4模型回归null

发布时间:2020-12-16 06:32:26 所属栏目:asp.Net 来源:网络整理
导读:所以我有一个视图,需要传入和传出几个不同的对象和对象列表,我已经创建了一个viewmodel.我的viewmodel看起来像这样 public class EditUserViewModel{ public ManageUsersViewModel ManageUsersViewModel { get; set; } public IEnumerableStateModel StateMo
所以我有一个视图,需要传入和传出几个不同的对象和对象列表,我已经创建了一个viewmodel.我的viewmodel看起来像这样

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的方式.进入视图,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部分工作正常它只是返回到控制器的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以允许索引.

解决方法

所以你的问题是模型绑定没有正确发生.

假设你有这两个型号:

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(为了正确发生模型绑定)需要如下所示:

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

请注意名称字段的结构 – 这是MVC如何确定哪些输入值映射到视图模型中的哪些属性.使用嵌套属性,属性名称必须放在它前面.

随着集合,它变得更加复杂.模型绑定器需要知道哪些值与属性的哪个实例相关.

例如,如果我们假设ChildModel在前面的示例中是IEnumerable类型,那么您的HTML可能看起来像这样,以便正确地建模绑定:

<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,你得到的名称错误的值.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读