2013-08-01 47 views
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.  
} 

我試過,但我的控制器不出現我的對象參數留空是撿模型。這可能嗎?

回答

6

有一個quick read about how model binding works ...模型綁定(這需要無論是張貼到你的行動,並把它變成了anyModel參數使用參數的類型來決定該怎麼做。

由於類型爲Object它不能做任何事情。

我的猜測(取決於你想要什麼來實現)是,你可以有幾個動作重載每個作爲參數,然後調用通用代碼不同類型的模型。

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

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

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

這表示有一個動作需要很多不同的模型是有點奇怪的。你有更好的機會做別的事情。

你的問題,如果你說你想實現

+2

我不認爲你可以有多個具有相同名稱的動作(不管參數)。 – zimdanen

+3

參數必須是不同的類型。 http://csharpindepth.com/Articles/General/Overloading.aspx –

+1

雖然只是重新閱讀你的評論(可能是我睡覺的時間)@zimdanen - yep ...雖然你可以肯定有重載方式和Actions *應該*只是方法我從來沒有真正做到這一點,所以不知道如果MVC或模型綁定將barf –

2

Asp.NET ModelBinder的不能這樣綁定一般對象的默認什麼可能收集更好的答案。您應該看看這裏瞭解DefaultModelBinder將如何在服務器中構建模型:Understanding ASP.NET MVC Model Binding

鑑於您的表單有很多模型,您應該將它們封裝到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.  
} 
0

最近我面臨着同樣的問題,如下解決它:

第1步:來自javascript傳遞2參數:

首先,將模型名稱作爲用於識別哪個模型的字符串來傳遞

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

第二步:在你的控制器:

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

該解決方案是一種變通方法。還有一個解決方案。你也可以檢查: How can I make a Controller Action take a dynamic parameter?

希望這會有所幫助。

相關問題