0

アクションコントローラーがリテラルオブジェクトを受け入れることは可能ですか? たとえば、さまざまなモデルを単一のコントローラーに投稿して、さらに処理するために着信モデル オブジェクトを決定できるいくつかのビューがあります。

モデルサンプル:

public class Model1
{
   // properties, etc.
}

public class Model2
{
   // properties, etc.
}

public class Model3
{
   // properties, etc.
}

コントローラーのサンプル:

[HttpPost]
public ActionResult ProcessModel(Object anyModel)
{
   // determine the model
   if((anyModel as Model1) != null)
   {
     var model1 = anyModel as Model1;
     // continue with code
   }
   else if((anyModel as Model2) != null)
   {
     var model2 = anyModel as Model2;
     // continue with code
   }
   // continue with model check, etc.       
}

試してみましたが、オブジェクト パラメーターが空のままであるため、コントローラーがモデルを取得していないようです。これは可能ですか?

4

3 に答える 3

2

デフォルトの Asp.NET ModelBinder は、この方法でジェネリック オブジェクトをバインドできません。DefaultModelBinder によってサーバーでモデルがどのように構築されるかを理解するには、ここを参照してください: ASP.NET MVC モデル バインディングについて.

フォームに多くのモデルがある場合、この種の操作を行うには、それらを ViewModel にカプセル化する必要があります。

ViewModel は次のようになります。

public class MyViewModel
{
  public Model1 Model1 {get; set;}
  public Model1 Model2 {get; set;}
  public Model1 Model3 {get; set;}
}

そしてコントローラー:

[HttpPost]
public ActionResult ProcessModel(MyViewModel myViewModel)
{
  // determine the model
  if(myViewModel.Model1 != null)
  {
    // continue with code
  }
  else if(myViewModel.Model2 != null)
  {
    // continue with code
  }
  // continue with model check, etc.       
}
于 2013-08-01T21:55:54.050 に答える
0

最近、同じ問題に直面し、以下のように解決しました。

ステップ 1: JavaScript パス 2 パラメータから:

まず、モデル名を文字列として渡し、どのモデルが来るかを識別します

次に、JSON.stringify(data)を使用して JavaScript からデータを渡します。データの入手元Model1, Model2 , Model3など

Step2:コントローラーで:

[HttpPost]
public ActionResult ProcessModel(string modelName, string anyModel)
{
   switch(modelName)  {
      case "Model1":
             var modelValue= JsonDeserialize<Model1>(anyModel);
              // do something 
           break;
     case "Model2": 
            var modelValue= JsonDeserialize<Model2>(anyModel); 
            // do something
           break;
    }
}

以下のような1つの方法が必要です。

public T JsonDeserialize<T>(string jsonModel){
return JsonConvert.DeserializeObject<T>(jsonModel, jsonSettings);
}

JsonConvert には名前空間「Newtonsoft.Json」が必要です。

また、以下のように jsonSettings を宣言する必要があります

         JsonSerializerSettings jsonSettings= new JsonSerializerSettings
    {
        TypeNameHandling = TypeNameHandling.All,
        DefaultValueHandling = DefaultValueHandling.Ignore
    };

このソリューションは一種の回避策です。もう1つの解決策があります。それも確認できます: コントローラーアクションに動的パラメーターを持たせるにはどうすればよいですか?

お役に立てれば。

于 2015-07-29T04:40:36.497 に答える