1

例えば:

class MyContoller
{
    [MyCustomAttribute]
    public ActionResult MyAction(ModelX fromRequest, ModelY fromSession, ModelZ fromCookie)
    {
       string productId = fromRequest.ProductId;
       string userId = fromSession.UserId;
       string cultureName = fromCookie.CultureName;
    }
}

理由:

コントローラーで Request、Session、および HttpContext にアクセスしたくありません。モデルをアクションに渡す MVC3 のデフォルトのアイデアは非常に優れています。

MyAction のパラメータ数を簡単に変更したい。たとえば、新しいパラメーターを追加すると、システムはパラメーターの名前またはタイプによって Request、Session、または Cookie の値を検索しようとし (Cookie 値にはカスタム ModelBinders が必要になる場合があると思います)、入力されたモデルをに渡します。私の行動。余分なコードを書く必要はありません。

カスタム属性 (例では MyCustomAttribute) でこのアイデアを実現できますか?

4

3 に答える 3

2

カスタム属性についてあなたに従っているかどうかはわかりません。カスタム属性には何を期待していますか?

はい、アクション メソッドは必要な数のモデル パラメーターを受け取ることができます。明らかに、特定のリクエストでバインドできるのは 1 つだけです (ビューは 1 つのモデルしか持てないため)。最初に見つかったものがバインドされ、他は null になります。

したがって、次のものがあるとしましょう。

public class ModelX {
    public string X {get;set;}
}

public class ModelY {
    public string Y {get;set;}
}

public class ModelZ {
    public string Z {get;set;}
}

そして、次のようなアクション メソッドがあります。

public ActionResult DoIt(ModelX x, ModelY y, ModelZ z)
{
    return View();
}

DoIt.cshtml には次の内容があります。

@model ModelZ

@using(Html.BeginForm()) {
    @Html.TextBoxFor(x => x.Z)
    <input type="submit"/>
}

テキスト ボックスに何かを入力して送信すると、モデル バインダーは入力した値で ModelZ をバインドし、ModelX と ModelY は null になります。

アクションメソッドが複数のモデルを同時にバインドできるという意味であれば、私はあなたに尋ねなければなりません..ビューに複数のモデルを持たせることをどのように正確に計画していますか? 確かに、複数のモデルを含むラッパー モデルを作成できますが、ビューには 1 つしか含めることができません。

于 2012-04-12T01:35:36.633 に答える
1

ModelXModelYおよびを組み込んだ複合 ViewModel クラスを作成しますModelZ。次に、新しい ViewModel クラスのインスタンスを生成し、それをコントローラー メソッドに渡すことができます。

public class XYZViewModel
{
    public ModelX fromRequest { get; set; }
    public ModelY fromSession { get; set; }
    public ModelZ fromCookie { get; set; }
}


public class MyController
{
    [MyCustomAttribute]
    public ActionResult MyAction(XYZViewModel myModel)
    {
       string productId = myModel.fromRequest.ProductId;
       string userId = myModel.fromSession.UserId;
       string cultureName = myModel.fromCookie.CultureName;
    }
}
于 2012-04-12T01:34:37.470 に答える
1

はい、コントローラーアクションにいつでも複数のパラメーターを渡すことができます。重要なのは、リクエストでそれらが適切にシリアル化されていることを確認することです。フォームを使用している場合は、Html ヘルパー メソッドを使用することを意味します。

たとえば、次のようなアクションが必要だとします。

public ActionResult Multiple(ModelA a, ModelB b)
{
    // ...
}

モデルごとに単純な部分ビューを作成できます。

@model MyProject.Models.ModelA
@Html.EditorForModel()

次に、Multipleビューで、部分ビューを次のようにレンダリングします。

@{ using (Html.BeginForm("Multiple", "MyController", FormMethod.Get))
{
    @Html.Partial("A", new MyProject.Models.ModelA())
    @Html.Partial("B", new MyProject.Models.ModelB())
    <input type='submit' value='submit' />
} 

ここではメソッドをGETに設定して、 MVC がパラメーターを渡す方法を簡単に確認できるようにします。フォームを送信すると、MVC が各オブジェクトを正常に逆シリアル化することがわかります。

于 2012-04-12T01:43:29.547 に答える