我正在使用VS2012 RC和MVC4,机器人用于所有意图和目的让我们假装它是MVC3。我想知道关于如何使用与父视图不同的模型处理PartialViews的标准最佳实践。
例如,这是一个显示所有可用角色的表的视图,还有一个允许用户添加更多角色的表单。
主视图 - Roles.cshtml:
@model IEnumerable<RobotDog.Models.RoleModel>
<table>
@foreach(var role in Model) {
<tr>
<td class="roleRow">@role.Role</td>
</tr>
}
</table>
<div class="modal hide">
@Html.Partial("_AddRolePartial")
</div>
_AddRolePartial.cshtml
@model RobotDog.Models.RoleModel
@using(Html.BeginForm("AddRole","Admin", FormMethod.Post)) {
@Html.TextBoxFor(x => x.Role, new { @class = "input-xlarge", @placeholder = "Role"})
<input type="submit" value="Submit" class="btn btn-primary btn-large"/>
}
型号:
public class RoleModel {
[Required]
[DataType(DataType.Text)]
[Display(Name = "Role")]
public string Role { get; set; }
}
观察控制器:
public ActionResult Roles() {
var model = from r in System.Web.Security.Roles.GetAllRoles()
select new RoleModel {Role = r};
return View(model);
}
PartialView的控制器:
[HttpPost]
public ActionResult AddRole(RoleModel model) {
try {
System.Web.Security.Roles.CreateRole(model.Role);
RedirectToAction("Roles");
} catch(Exception) {
ModelState.AddModelError("", "Role creation unsuccessful.");
}
return ????; // not sure how to pass ModelState back to partialView
}
我考虑创建一个包含RoleModel
和IEnumerable<RoleModel>
的ViewModel,但似乎会有更多的流式方法来实现我想要的,而不必每次我想使用时都创建一个ViewModel这部分视图。
答案 0 :(得分:1)
我想您正在询问如何将RoleModel传递给添加RoleModel模式弹出窗口。由于您正在创建一个新角色,我假设您需要一个空模型。你可以像下面这样传递它:
<div class="modal hide">
@Html.Partial("_AddRolePartial", new RoleModel())
</div>
或者只使用控制器的支持GET方法执行@Html.RenderAction("AddRole")
以支持填充项目。
public ActionResult AddRole() {
var model = new RoleModel();
//populate with any items needed for the Add Role Model View
return View(model);
}
答案 1 :(得分:0)
如何将表单帖子更改为ajax表单帖子,目标更新部分ID为div
,您将添加到父视图(实际上是围绕Roles.cshtml)。
添加public ActionResult _Roles()
return PartialView("Roles", model)
接下来,在发布操作中,最后Return RedirectToAction(...Roles Partial Action ...)
并删除try
中的RedirectToAction(“角色”)。
答案 2 :(得分:0)
我个人不喜欢对表单使用部分视图,因为部分视图不能正确呈现子模型(即,它们没有考虑模型的层次结构)。
这就是Display和EditorTemplates存在的原因。它们适用于呈现特定数据类型。
但是,在您的情况下,由于您的视图没有自己的任何形式,并且最终结果只是父模型集合中的单个项目,因此部分视图实际上是更好的方法,因为您可以传递与视图不同的模型。
正如其他人所指出的那样,您可以轻松地将空模型作为第二个参数传递给partial。我不喜欢在视图中新建新对象,但看起来并没有很多选择,因为替代方案会非常混乱。