簡體   English   中英

對象作為動作控制器的參數?

[英]Object as a parameter for an action controller?

動作控制器是否可以接受文字對象。 例如,我有幾個視圖,我想將各種模型發布到單個控制器中,然后可以確定傳入的模型對象以進行進一步處理。

模型樣本:

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

我已經嘗試過了,但是由於我的對象參數仍然為空,所以控制器似乎沒有拾取模型。 這可能嗎?

快速了解模型綁定的工作原理 ... 模型綁定器(它將任何內容發布到Action並將其轉換為anyModel參數)使用參數的類型來確定要執行的操作。

由於類型是Object因此它無法執行任何操作。

我的猜測(取決於您要實現的目標)是,您可以有多個Action重載,每個重載都使用不同類型的Model作為參數,然后調用通用代碼。

[HttpPost]
public ActionResult ProcessModel(Model1 anyModel){}

[HttpPost]
public ActionResult ProcessModel(Model2 anyModel){}

[HttpPost]
public ActionResult ProcessModel(Model3 anyModel){}

那就是說采取一個動作需要很多不同的模型有點奇怪。 您很有可能要做其他事情。

如果您說出自己要實現的目標,那么您的問題可能會得到更好的答案

默認的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.       
}

最近,我遇到了相同的問題,並通過以下方法解決了該問題:

步驟1:從javascript pass 2參數開始:

首先,將模型名稱作為字符串傳遞,以識別即將到來的模型

其次,使用JSON.stringify(data)從javascript傳遞數據。 您的數據可以來自Model1, Model2 , Model3等。

步驟2:在您的控制器中:

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

您需要一種如下所示的方法:

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

此解決方案是一種解決方法。 還有另一種解決方案。 您還可以檢查以下內容: 如何使Controller Action接受動態參數?

希望這可以幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM