可以访问自定义模型绑定器中的已发布值

时间:2017-07-03 08:36:01

标签: asp.net-mvc asp.net-core asp.net-core-mvc

目前我有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 值?

1 个答案:

答案 0 :(得分:0)

自定义模型绑定器处理对象而不是通用列表。您无法访问活页夹内的所有列表,但可以访问每个单独的对象。

有了这个说法,我不相信你可以抽象代码,因为你没有ControllerContext你需要访问binder上下文中的FormCollection,也不执行{ {1}}调用以获取TryUpdateModelAsync上不存在的表单帖子中的额外信息。你只需要ModelBindingContext。

如果你还想尝试,你有一个很好的工作示例here

以下是相关部分,您可以在其中获取对象的引用:

List<BaseField>