我对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而不是对象上声明属性???
答案 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
脚本。