目前我有IActionFilter
接受List<T>
作为参数。在该操作方法中,我检查发布的viewmodel值。它看起来像这样:
[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
中的(1 + 2)/2
(2 + 3)/2
(3 + 4)/2
(4 + 5)/2
值?
答案 0 :(得分:0)
自定义模型绑定器处理对象而不是通用列表。您无法访问活页夹内的所有列表,但可以访问每个单独的对象。
有了这个说法,我不相信你可以抽象代码,因为你没有ControllerContext
你需要访问binder上下文中的FormCollection
,也不执行{ {1}}调用以获取TryUpdateModelAsync
上不存在的表单帖子中的额外信息。你只需要ModelBindingContext。
如果你还想尝试,你有一个很好的工作示例here。
以下是相关部分,您可以在其中获取对象的引用:
List<BaseField>