发布复杂的viewmodels使用ajax.beginForm MVC4只获得null

时间:2013-07-17 11:53:31

标签: asp.net-mvc-4 complextype ajax.beginform

我对mvc非常新,以免我说有一个视图模型可以包含像

这样的对象
public class vm_set_rol
{
    public IEnumerable<SelectListItem> roles { get; set; }
    public Rol_User rol { get; set; }

}

rol是一个像这样的对象:

public class Rol_User
{
    public int idUser { get; set; }
    public int Role { get; set; }
    public int GrantedBy { get; set; }
    public bool canGrant { get; set; }
    public DateTime ExpirationDate { 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>

问题是我只得到空值,如果我在模型上创建一些其他属性,如字符串或int,那些回发好了,

我有点低估了为什么没有贴回物品,胸围是否有任何解决方法???或者在模式上放置一个对象是错误的,我shuld在viewmodel而不是对象上声明属性???

1 个答案:

答案 0 :(得分:1)

您的下拉列表绑定不正确。它应绑定到标量属性以保存所选值:

@Html.DropDownListFor(
    m => m.rol.Role, 
    Model.roles, 
    new { id = "AdmPermUserRolesDropDown" }
)

就Roles集合属性而言,它在控制器操作中始终为null,因为在提交表单时,此列表永远不会发送到服务器。仅发送选定的值。因此,如果您需要再次重新显示此视图,则必须像在GET操作中一样填充HttpPost操作中的Roles集合属性。

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

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

最后但同样重要的是,由于您使用的是Ajax.BeginForm,请确保您在视图中引用了jquery.unobtrusive-ajax.js脚本。