1

我将 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);
}

部分视图的控制器:

[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
}

我考虑过创建一个持有的 ViewModel,RoleModelIEnumerable<RoleModel>似乎会有一种更流线型的方式来完成我想要的,而不必每次我想使用这个 PartialView 时都创建一个 ViewModel。

4

3 回答 3

1

我想您是在问如何将 RoleModel 传递给 add RoleModel 模式弹出窗口。由于您正在创建一个新角色,我假设您需要一个空模型。您可以像下面这样传递它:

<div class="modal hide">
    @Html.Partial("_AddRolePartial", new RoleModel())
</div>

或者只是@Html.RenderAction("AddRole")使用控制器的支持 GET 方法来支持填充项目。

public ActionResult AddRole() {
    var model = new RoleModel();
    //populate with any items needed for the Add Role Model View
    return View(model);
}
于 2012-09-05T05:46:33.387 回答
0

如何将表单帖子更改为带有目标更新部分 id 的 ajax 表单帖子div,您将添加到父视图(有效地围绕 Roles.cshtml)。

添加一个新动作public ActionResult _Roles(),它将return PartialView("Roles", model)

接下来,在 Post Action中,Return RedirectToAction(...Roles Partial Action ...)最后并删除try.

于 2012-09-05T03:12:21.827 回答
0

我个人不喜欢在表单中使用局部视图,因为局部视图不能正确渲染子模型(即,它们没有考虑模型的层次结构)。

这就是存在 Display 和 EditorTemplates 的原因。它们适用于呈现特定的数据类型。

但是,在您的情况下,由于您的视图没有自己的任何形式,并且最终结果只是父模型集合的单个项目,因此 Partial View 实际上是一种更好的方法,因为您可以通过与视图使用的模型不同的模型。

正如其他人指出的那样,您可以轻松地将空模型作为第二个参数传递给部分。我不喜欢在视图中更新新对象,但看起来那里没有很多选择,因为替代方案会非常混乱。

于 2012-09-05T05:57:53.730 回答