2017-07-03 21 views
0

當前我有一個IActionFilter接受List<T>作爲參數。在該動作方法中,我檢查發佈的視圖模型值。它看起來像這樣:獲取定製modelbinder中發佈的值

[HttpPost] 
public async Task<IActionResult> SavePage(List<BaseField> fields) 
{ 
    for (var i = 0; i < fields.Count; i++) 
    { 
     if (fields[i].Type == "bb") 
     { 
      var inputObj = new InputConfigViewModel(); 
      await TryUpdateModelAsync(inputObj, $"fields[{i}]"); 
     } 
     if (fields[i].Type == "ee") 
     { 
      var tObj = new TextareaConfigViewModel(); 
      await TryUpdateModelAsync(tObj, $"fields[{i}]"); 
     } 
    } 

    return RedirectToAction("Index", "Dashboard"); 
} 

這個工程到目前爲止。但是我想將這些代碼抽象到一個自定義類ModelBinder

public class BaseFieldModelBinder : IModelBinder 
{ 
    public Task BindModelAsync(ModelBindingContext bindingContext) 
    { 
     // Need access to "List<BaseField> fields"... 

     return Task.CompletedTask; 
    } 
} 

我怎樣才能訪問List<BaseField> fields值在我ModelBinder,就像我可以從操作方法在我Controller

回答

0

自定義模型綁定器可以處理對象而不是通用列表。您無法訪問活頁夾中的所有列表,但可以訪問每個單獨的對象。

與此說,我不相信你可以抽象的代碼,因爲你沒有ControllerContext你需要訪問FormCollection粘結劑上下文中,既不是爲了獲得額外的信息來執行TryUpdateModelAsync通話來自List<BaseField>上不存在的表單帖子。你只需要ModelBindingContext。

如果你仍然想嘗試,你有一個很好的工作示例here

下面是相關的部分,在那裏你可以得到對象的引用:

// Try to fetch the value of the argument by name 
var valueProviderResult = bindingContext.ValueProvider.GetValue(modelName); 

if (valueProviderResult == ValueProviderResult.None) 
{ 
    return TaskCache.CompletedTask; 
} 

bindingContext.ModelState.SetModelValue(modelName, valueProviderResult); 

var value = valueProviderResult.FirstValue; 

// Check if the argument value is null or empty 
if (string.IsNullOrEmpty(value)) 
{ 
    return TaskCache.CompletedTask; 
}