2017-07-03 10 views
0

現在、私はパラメータとしてList<T>を受け入れるIActionFilterを持っています。このアクションメソッドでは、投稿されたビューモデル値を調べます。これは次のようになります。カスタムモデルバインダーに掲載された値にアクセスする

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

どのように私は私ができるように私のControllerにアクションメソッドから、私のModelBinderList<BaseField> fields値にアクセス入手できますか?

答えて

0

カスタムモデルバインダーは、汎用リストではなくオブジェクトで動作します。バインダー内のすべてのリストにアクセスすることはできませんが、個々のオブジェクトにアクセスすることはできます。これにより

は、あなたが持っていないので、私は、あなたが抽象コードできると信じていない、と述べたControllerContextあなたは、余分な情報を得るためにTryUpdateModelAsync呼び出しを実行しないようにどちらも、バインダーのコンテキスト内FormCollectionにアクセスする必要がありますフォームのポストから、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; 
} 
関連する問題