1

私はVS2012RCをMVC4で使用しています。ボットはすべての目的と目的で、MVC3のふりをしてみましょう。親ビューとは異なるモデルを使用するフォームでPartialViewを処理する方法に関する標準のベストプラクティスを知りたいです。

たとえば、これは、使用可能なすべてのロールのテーブルを表示し、ユーザーがさらにロールを追加できるフォームを備えたビューです。

メインビュー-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
}

保持するViewModelを作成することを考えましたが、このPartialViewを使用するたびに、ViewModelを作成しなくても、必要なことを実現するためのより合理的な方法があるようですRoleModelIEnumerable<RoleModel>

4

3 に答える 3

1

RoleModelをaddRoleModelモーダルポップアップに渡す方法を尋ねていると思います。新しいロールを作成しているので、空のモデルが必要だと思います。以下のように渡すことができます:

<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

フォームの投稿がajaxフォームの投稿に変更され、ターゲットの更新部分IDdivが親ビュー(実質的にRoles.cshtmlを囲む)に追加されるのはどうですか。

新しいアクションを追加しpublic ActionResult _Roles()ますreturn PartialView("Roles", model)

次に、Post ActionReturn RedirectToAction(...Roles Partial Action ...)で、最後に、のRedirectToAction( "Roles")を削除しますtry

于 2012-09-05T03:12:21.827 に答える
0

部分ビューはサブモデルを正しくレンダリングしないため(つまり、モデルの階層が考慮されないため)、フォームで部分ビューを使用するのは個人的には好きではありません。

これが、DisplayおよびEditorTemplatesが存在する理由です。これらは、特定のデータ型のレンダリングに適しています。

ただし、あなたの場合、ビューには独自の形式がなく、最終結果は親モデルのコレクションの1つのアイテムにすぎないため、パスできるという理由だけで、部分ビューの方が実際には優れたアプローチです。ビューが使用するものとは異なるモデル。

他の人が指摘しているように、2番目のパラメーターとして空のモデルをパーシャルに簡単に渡すことができます。ビュー内の新しいオブジェクトを新しくするのは好きではありませんが、選択肢がかなり乱雑になるため、選択肢がたくさんあるようには見えません。

于 2012-09-05T05:57:53.730 に答える