如何使用与父视图不同的模型处理局部视图

时间:2012-09-05 02:27:12

标签: c# asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 partial-views

我正在使用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
}

我考虑创建一个包含RoleModelIEnumerable<RoleModel>的ViewModel,但似乎会有更多的流式方法来实现我想要的,而不必每次我想使用时都创建一个ViewModel这部分视图。

3 个答案:

答案 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。我不喜欢在视图中新建新对象,但看起来并没有很多选择,因为替代方案会非常混乱。