Asp.net mvc 4 使用ajax.MVC4发布复杂的视图模型时,只会得到null

Asp.net mvc 4 使用ajax.MVC4发布复杂的视图模型时,只会得到null,asp.net-mvc-4,complextype,ajax.beginform,Asp.net Mvc 4,Complextype,Ajax.beginform,我对mvc非常陌生,我有一个包含如下对象的viewmodel public class vm_set_rol { public IEnumerable<SelectListItem> roles { get; set; } public Rol_User rol { get; set; } } 因此,我在视图上有一个表单,允许用户从角色下拉列表中选择1个角色,并选择日期和复选框,如: <div class="ModalContainer">

我对mvc非常陌生,我有一个包含如下对象的viewmodel

public class vm_set_rol
{
    public IEnumerable<SelectListItem> roles { get; set; }
    public Rol_User rol { get; set; }

}
因此,我在视图上有一个表单,允许用户从角色下拉列表中选择1个角色,并选择日期和复选框,如:

      <div class="ModalContainer">
        @using (Ajax.BeginForm(new AjaxOptions
                                        {
                                            UpdateTargetId = "gestionRolContainer",
                                            Url = "Permiso/Test",                                               
                                            InsertionMode = InsertionMode.Replace,
                                            HttpMethod = "POST",



                                        }
                                )
                )
        { 
            <fieldset>
                    <legend>@Res_String.RolLabel</legend>

                    <span>ROL:</span><br />@Html.DropDownListFor(m => m.rol, Model.roles, new {@id="AdmPermUserRolesDropDown" })
                    <br />

                    @Html.CheckBoxFor(m => m.rol.conceder ,Model.rol.conceder) <span>Delegate?</span>
                    <br />

                    <input type="submit" class="buttonClass" value="OK" />
            </fieldset>


        }
</div>

@使用(Ajax.BeginForm)(新的AjaxOptions
{
UpdateTargetId=“gestionRolContainer”,
Url=“Permiso/Test”,
InsertionMode=InsertionMode.Replace,
HttpMethod=“POST”,
}
)
)
{ 
@Res_String.RolLabel
ROL:
@Html.DropDownListFor(m=>m.ROL,Model.roles,new{@id=“AdmPermUserRolesDropDown”})
@(m=>m.rol.concender,Model.rol.concender)委托的检查框?
}
问题是我只得到空值,如果我在模型上创建了一些其他属性,比如字符串或int,那么这些属性会被发回ok


我有点理解为什么对象没有被发回,有什么解决办法吗???或者将对象放在模式上是错误的,我应该在viewmodel上声明属性而不是对象???

您的下拉列表绑定错误。它应绑定到标量属性以保存选定值:

@Html.DropDownListFor(
    m => m.rol.Role, 
    Model.roles, 
    new { id = "AdmPermUserRolesDropDown" }
)
就角色集合属性而言,它在控制器操作中始终为null,因为在提交表单时,此列表从未发送到服务器。仅发送选定的值。因此,如果需要再次重新显示此视图,则必须像在GET操作中一样,在HttpPost操作中填充Roles集合属性

此外,您的复选框被绑定到某个
m=>m.rol.concender
属性,该属性在您显示的视图模型中不存在。我猜您的意思是使用
canGrant
布尔属性。此外,您不需要将该值作为第二个参数提供给checkboxhelper。它将从lambda表达式中推断:

@Html.CheckBoxFor(m => m.rol.canGrant) <span>Delegate?</span>
@Html.CheckBoxFor(m=>m.rol.canGrant)委托?

最后但并非最不重要的一点是,由于您使用的是
Ajax.BeginForm
请确保您在视图中引用了
jquery.unobtrusive Ajax.js
脚本。

tks 4答案是,上面的所有代码都是一个已翻译的示例,canGrant在我的应用程序中是一个让步者,只是翻译错误,但在下拉列表中,tks
@Html.CheckBoxFor(m => m.rol.canGrant) <span>Delegate?</span>