使用ajax.beginForm MVC4发布复杂的视图模型,结果只为null



我对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; }
}

所以我在视图上有一个表单,让用户从角色下拉列表中选择一个角色,并选择一个日期和一个复选框,比如:

      <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,我只会得到null值,这些值会被发布回来,好的,

我有点理解为什么物品没有寄回,半身像有什么变通办法吗???或者把一个对象放在模式上是错误的,我应该在视图模型上声明属性,而不是对象???

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

@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脚本。

最新更新