如何处理MVC模型绑定前缀重复集合中的每一行相同的形式?(How to handle MVC mod

2019-08-17 02:09发布

我的主要观点模型ChildViewModel的集合。 在视图中,我遍历集合并调用EditorFor(),像这样:

@for (int i = 0; i < Model.Children.Count; i++)
{
    @Html.EditorFor(m => m.Child[i]);
}

编辑模板的样子:

@model ChildModel

@using (Html.BeginForm("EditChild", "MyController"))
{
    @Html.HiddenFor(m => m.ChildId)
    @Html.TextBoxFor(m => m.ChildName)
}

这将生成的标记,其中每个儿童是在一个单独的形式,并且每个这样的形式将具有类似儿童[0] .ChildName名称的输入控制。 我使用一个单独的形式,为每个孩子,孩子就会显示一个在每行,然后用户可以编辑和提交一行。

我的表单操作方法是:

[HttpPost]
public ActionResult EditChild(ChildViewModel form) { }

问题是,当这个被调用时,模型的所有属性将是无效的,因为模型绑定不知道前缀。 在某些情况下,我们可以使用BindAttribute讲述前缀模型绑定,但在这种情况下,前缀是不是恒定的:这将是儿童[0],儿童[1],等等。

总之,我们要重复相同的形式收集的每一行,然后允许用户发布一个单一的形式。 如何处理网络ID,名称前缀和模型在这种情况下绑定?

Answer 1:

我有同样的问题与你,有我的解决方案,希望它可以帮助你。

在EditorTemplate或局部视图中添加一个隐藏的输入

<input type="hidden" name="__prefix" value="@ViewData.TemplateInfo.HtmlFieldPrefix" />

定义自定义模型粘合剂和覆盖BindModel方法

public class CustomModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var prefixValue = bindingContext.ValueProvider.GetValue("__prefix");
        if (prefixValue != null)
        {
            var prefix = (String)prefixValue.ConvertTo(typeof(String));
            if (!String.IsNullOrEmpty(prefix) && !bindingContext.ModelName.StartsWith(prefix))
            {
                if (String.IsNullOrEmpty(bindingContext.ModelName))
                {
                    bindingContext.ModelName = prefix;
                }
                else
                {
                    bindingContext.ModelName = prefix + "." + bindingContext.ModelName;

                    // fall back
                    if (bindingContext.FallbackToEmptyPrefix && 
                        !bindingContext.ValueProvider.ContainsPrefix(bindingContext.ModelName))
                    {
                        bindingContext.ModelName = prefix;
                    }
                }
            }
        }
        return base.BindModel(controllerContext, bindingContext);
    }
}

该模型粘结剂将削减前缀,使默认的模型绑定工作。



文章来源: How to handle MVC model binding prefix with same form repeated for each row of a collection?