【问题标题】:Parent model have 2 properties one comes null on Add父模型有 2 个属性,其中一个在添加时为空
【发布时间】:2015-04-21 14:16:26
【问题描述】:

我创建了一个 ParentModel,因为我想在其中使用两个模型,以便我可以在 MVC 中使用相同的视图。

当我在初始加载时获得数据时,父模型中定义的两个属性都会正确填充。 但是,当我尝试添加新数据时,我看到第二个属性为空。 这是我的代码:

public class UserModel
{
    public User User { get; set; }        
    public IEnumerable<RolesModel> rolesModel { get; set; }
}

[HttpPost]
[ValidateAntiForgeryToken()]
public ActionResult Add(UserModel userDetails)
{
    try
    {
        if (ModelState.IsValid)
        {
            userDetails.User.FullName = userDetails.User.FirstName + " " + userDetails.User.MiddleName + " " + userDetails.User.LastName;
            userDetails.User.CreatedDate = DateTime.Now;
            _userService.Insert(userDetails.User);
            _unitOfWorkAsync.SaveChanges();
            foreach (RolesModel rolesModel in userDetails.rolesModel)
            {
                // Here userdetails.rolesmodel is null
            }
        }

查看:

@model Axp.Gcst.Gps.Web.Areas.Admin.Models.UserModel
@using (Html.BeginForm("Add", "user", FormMethod.Post, new { @class = "form-horizontal" }))
{
    @Html.AntiForgeryToken()
    @Html.Partial("_UserDetails", Model)
    @foreach (var itemRole in Model.rolesModel)
    {                          
        if (itemRole.Role.RoleGroupId == item.RoleGroupId)
        {
            <div class="col-md-12 col-sm-12 col-xs-12 panel_cell">
                @Html.CheckBoxFor(model => itemRole.isSelected, new { @class = "panel_checkbox" })
                @Html.DisplayFor(model => itemRole.Role.Name)
            </div>
            @Html.HiddenFor(model=>itemRole.Role.RoleId)
        }
    }
}

【问题讨论】:

    标签: c# asp.net-mvc razor


    【解决方案1】:

    当您将 List Back 回发到控制器时,您应该使用 for 循环:

    @foreach (var itemRole in Model.rolesModel)
    {
        if (itemRole.Role.RoleGroupId == item.RoleGroupId)
        {
    
            @Html.CheckBoxFor(model => itemRole.isSelected, new { @class = "panel_checkbox" })
            @Html.DisplayFor(model => itemRole.Role.Name)
            @Html.HiddenFor(model => itemRole.Role.RoleId)
        }
    }
    

    使用 For 循环:

    @for(int i =0; i< Model.rolesModel.Count; i++){
                @Html.CheckBoxFor(m => m.rolesModel[i].isSelected, new { @class = "panel_checkbox" })
                @Html.DisplayFor(m => m.rolesModel[i].Role.Name)
                @Html.HiddenFor(m => m.rolesModel[i].Role.RoleId)
    
    }
    

    这里有一个类似的答案:https://stackoverflow.com/a/27926181/1910735

    MVC 模型绑定器要求输入字段的格式为:

    list[0].prop1
    list[0].prop2
    list[0].prop3
    
    list[1].prop1
    list[1].prop2
    list[1].prop3
    

    【讨论】:

    • Thanks.if (model => Model.rolesModel[i].Role.RoleGroupId == tblTestList[j].RoleGroupId) 这条线给出错误“无法将 lambda 表达式转换为 'bool' 类型,因为它不是委托类型”
    • model => 模型应该是 model => model.rolesModel
    • 为什么if条件下需要model =>
    • 只做:if(Model.rolesModel[i].Role.RoleGroupId == tblTestList[j].RoleGroupId)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 2014-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多