2

私の最初の実際の MVC アプリケーションでは、ほぼすべてのページでこれに遭遇しています。私は何かが欠けていると確信しています。

私が現在扱っている例:

ページには、複数のドロップダウン (フィルター) とグリッドがあります。フィルターを設定するかみそりのコードと、最初にデータのビュー モデルを使用するグリッドがあります。すべてが順調で、コードはクリーンで、ページは完全に読み込まれます。

ここで、別のフィルター オプションを選択すると、他のドロップダウンの一部が変更される可能性があり、グリッド内のデータが確実に変更されます。そのため、新しいデータを取得するために、コントローラー メソッドの 1 つに ajax 呼び出しを行っています。次に、変更されたドロップダウンとともに JS でグリッドを再構築する必要があります。これは、最初のページ読み込みで Razor コードが行うことを複製しているだけです。

Razor でクラスや属性などを追加した場合、これも JS で複製する必要があります。

私が見逃しているパターンがあるはずです。この時点で、更新が ajax で動的に行われるかどうかは気にしません。「ポストバック」を使用してRazorですべてを実行できれば、それで問題ありません。この大規模なコードの重複を避けるためのもの。

4

1 に答える 1

2

PartialView最初のページ読み込みとまったく同じ を作成できます。

public ViewResult Details(int id)
{
    DetailsModel model = new DetailsModel...

    return View(model);
}

上記の場合、あなたはFilterModelのメンバーである可能性がありDetailsModelます。どちらの方法でも、何を提示するかについていくつかのデータを処理する必要がある場合は、部分的なアクション メソッドを作成できます。

public PartialViewResult Filters(int someParams...)
{
    FilterModel model = new FilterModel...
    return PartialView("Filters"
}

次に、次のようにビューから呼び出します。

<div id="filters">
    @Html.Action("Filters", someParams)
</div>

またはこれFilterModelがのメンバーである場合DetailsModel

<div id="filters">
    @Html.Partial("Filters", Model.FilterModel)
</div>

クライアント側で更新する必要がある場合は、その部分を再度リクエストできます。

var filterUrl = "@Html.ActionLink("Filters")";

$(...).change(function(){
    $("#filters").load(filterUrl);
});
于 2012-08-28T13:18:55.783 に答える