2017-07-03 2 views
0

Derzeit habe ich eine IActionFilter, die eine List<T> als Parameter akzeptiert. In dieser Aktionsmethode untersuche ich die veröffentlichten Viewmodel-Werte. Es sieht ungefähr so ​​aus:Zugriff auf gebuchte Werte in benutzerdefinierten Modellbinder

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

Das funktioniert so weit. Aber ich möchte diesen Code zu einer benutzerdefinierten ModelBinder Klasse abstrahieren.

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

     return Task.CompletedTask; 
    } 
} 

Wie kann ich erhalten die List<BaseField> fields Werte in meinem ModelBinder, wie kann ich von der Aktion-Methode in meinem Controller?

Antwort

0

Benutzerdefinierte Modellmappen arbeiten an Objekten und nicht an generischen Listen. Sie können nicht auf die gesamte Liste im Ordner zugreifen, aber Sie können auf jedes einzelne Objekt zugreifen.

Mit diesem wird gesagt, ich glaube nicht, dass Sie abstrahieren kann der Code, weil Sie das nicht haben ControllerContext müssen Sie die FormCollection innerhalb des Bindemittel Kontext zuzugreifen, weder die TryUpdateModelAsync Anruf auszuführen, um zusätzliche Informationen zu erhalten vom Formpost, der auf dem List<BaseField> nicht anwesend ist. Sie haben nur den ModelBindingContext.

Wenn Sie noch versuchen möchten, haben Sie ein gutes Arbeitsbeispiel here.

Hier ist der relevante Teil, in dem Sie die Referenz des Objekts erhalten können:

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