2016-03-02 267 views
1

我有以下控制器動作混合綁定和FromBody屬性MVC 6

[HttpPut("{id}")] 
public void Put(int id, [Bind("BirthDate")][FromBody]ExpandoObject value) 
{ 
    _dataContext.Update(value); 
} 

我試圖限制允許的屬性,我認爲這會工作,但是,它不是不和值接收所有發送的值,而不僅僅是生日 - 我不想使用視圖模型,因爲我想要發送動態對象。僅供參考,這不適用於普通的模型對象。

這是我送在請求中的主體

{ 
     "FirstName": "Lionell", 
     "LastName": "Messi", 
     "BirthDate": "2009-04-06T11:54:29.047", 
     "PhoneNumber": "1234567890", 
     "EmailAddress": "[email protected]", 
     "SchoolId": 1, 
     "IsIndependent": true 
} 

回答

0

通過源代碼讀取後JSON,張貼在請求主體中的JSON時,所述BodyModelBinder被使用。不幸的是,這個模型聯編程序似乎不適用IPropertyBindingPredicateProvider實例提供的PropertyFilters,如[Bind]屬性。

它只是使用了JsonInputFormatter到JSON反序列化到模型類型:

var formatters = bindingContext.OperationBindingContext.InputFormatters; 
var formatter = formatters.FirstOrDefault(f => f.CanRead(formatterContext)); 

... 

try 
{ 
    var previousCount = bindingContext.ModelState.ErrorCount; 
    var result = await formatter.ReadAsync(formatterContext); 
    var model = result.Model; 

這似乎是對我的錯誤...

在此期間,你可以嘗試評估某些選項你有空。正如the docs指出我們所知道的格式化程序Json.Net:

JsonInputFormatter是默認的格式,它是基於關閉的 Json.NET。

所以基本上你需要遵循一種方法來排除與Json.Net一起使用的屬性,如使用[JsonIgnore]屬性。 (或者只是使用不包含這些屬性:)一些DTO對象)

當然你的情況的是困難,因爲你有一個動態的對象,而不是一個強類型的對象,這意味着:

  1. 沒有類型可以應用屬性
  2. Json.net將不知道您在控制器操作中設置的任何屬性。

你可以探索更新JsonSerializerSettings,例如試圖用一個contract resolver動態排除屬性。您可能需要一些將路由和參數鏈接爲忽略的全局配置,以便根據當前請求決定何時忽略某個屬性。

如果微軟修復了這一切,那麼所有這些都將變得更加簡單!

+0

我會研究它,謝謝 – gilmishal