2016-08-24 20 views
-2

我想這樣做:在動作方法中,如何將發佈數據綁定到動態對象?

public ActionResult SaveStuff(dynamic vm) { 

    StoreTheValue(vm.myvalue); 

    return Content("Saved :)"); 
} 

這不起作用,MVC似乎並不想創建一個對應於請求的數據後性能的動態對象。

現在我知道正確定義的視圖模型的全部重點是創建強類型的數據結構並將MVC綁定到它們的數據,但鑑於我使用ajax發佈JavaScript數據,它不是強類型數據,所以我沒有看到我通過這樣做失去了可維護性,並且這將節省我創建視圖模型類的時間和精力。

任何人都可以幫助建議如何綁定發佈數據到動態對象,可能使用自定義模型綁定器?

+1

「將節省我的時間和精力創建視圖模型CLAS ses「快速做某事並不總是創建可維護程序的最佳方式。創建DTO對象並不難,因爲DTO對象只是保存來自請求的信息,您應該明確地承擔這個負擔。特別是當你已經知道你的請求的對象是什麼樣的 - 爲什麼不爲他們創建一個類?只是爲了保存一些代碼行不是一個好主意。 – HimBromBeere

+0

@HimBromBeere:對不起,但我不感興趣的迴應告訴我,我應該和不應該遵循什麼編程指南。我只想知道如何將發佈數據綁定到動態對象。 – BG100

回答

1

一種可能的方式來實現,這將是使用自定義的模型綁定,假設您發佈的Json的行動

public class DynamicBinder : IModelBinder 
    { 
     public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
     { 
      using(var streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream)) 
      { 
       return JsonConvert.DeserializeObject<dynamic>(streamReader.ReadToEnd()); 
      } 
     } 
    } 

然後在你的行動,你可以告訴它,使用自定義粘合劑

public ActionResult SaveStuff([ModelBinder(typeof(DynamicBinder))]dynamic vm) { 

    StoreTheValue(vm.myvalue); 

    return Content("Saved :)"); 
} 

然後發佈JSON這樣:

{ 
    "myvalue":{...} 
} 
1

dynamic類型和ajax請求與js 不對應

你總是可以在js端創建你的強類型對象屬性。

反正你可以使用FormCollection這樣的:

[HttpPost] 
public ActionResult yourAction(FormCollection collection) 
{ 
    StoreTheValue(Convert.ToString(collection["myvalue"])); 

    return Content("Saved :)"); 
} 

但我認爲這是更好地想起強類型的方式。

+0

這不會綁定到一個動態的對象...不是我想要的。不管怎麼說,還是要謝謝你。 – BG100

+0

@ BG100我的意思是你不能用MVC綁定來做到這一點。如果你不想使用強類型的'ViewModel'唯一的房子是'FormCollection' –

+0

所以你說這是不可能的...?如何使用自定義模型聯編程序? – BG100

相關問題