0

我对 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,则这些属性会被回发,

我有点理解为什么不回发对象,胸围有什么解决方法吗???或者在模式上放置一个对象是错误的,我应该在视图模型上声明属性而不是对象???

4

1 回答 1

1

您的下拉菜单绑定不正确。它应该绑定到一个标量属性以保存选定的值:

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

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

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

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

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

于 2013-07-17T12:03:03.730 回答