使用HtmlFieldPrefix将数据发布到行动产生空模型

时间:2019-06-23 19:43:27

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

在我的应用程序中,我有一些模式窗口。它们每个都具有相同的局部视图和相同的视图模型,但显示其他数据。为此,我生成了一个动态HtmlFieldPrefix以便没有多个相同名称的ID。示例:


@foreach (var product in Model.Products)
{
    string buyModalId = product.BuyModel.BindingPrefix;
    @await Html.PartialForAsync("_BuyForm", product.BuyModel, buyModalId)
}

BindingPrefix包含一个动态添加的字符串(例如buy-product-{ID})。在我看来,我还有一个隐藏字段,该字段应该将绑定前缀发布回去:

@Html.Hidden(nameof(Model.BindingPrefix), Model.BindingPrefix)

(来源:Asp.Net MVC Dynamic Model Binding Prefix

但是,这不起作用,因为发布时绑定前缀也是null。因此,我控制器中的await TryUpdateModelAsync(model, model.BindingPrefix);失败。

Html.PartialForAsync方法的代码如下:

public static Task<IHtmlContent> PartialForAsync(this IHtmlHelper htmlHelper, string partialViewName, object model, string prefix)
{
    var viewData = new ViewDataDictionary(htmlHelper.ViewData);
    var htmlPrefix = viewData.TemplateInfo.HtmlFieldPrefix;
    viewData.TemplateInfo.HtmlFieldPrefix += !Equals(htmlPrefix, string.Empty) ? $".{prefix}" : prefix;
    var part = htmlHelper.PartialAsync(partialViewName, model, viewData);
    return part;
}

(来源:MVC 6 VNext how to set HtmlFieldPrefix?

我想念什么?为什么我的模型仍然null?删除绑定前缀时,绑定可以正常工作-但浏览器会发出有关多个相同ID的警告。

1 个答案:

答案 0 :(得分:0)

通过在模型中使用自定义模型联编程序找到了答案:

public override void BindModel(ModelBindingContext bindingContext)
{
    var providers = bindingContext.ValueProvider as System.Collections.IList;
    var formProvider = providers?.OfType<JQueryFormValueProvider>().FirstOrDefault();
    if (formProvider != null)
    {
        var (_, value) = formProvider.GetKeysFromPrefix(string.Empty).First();
        bindingContext.BinderModelName = value;
        bindingContext.FieldName = value;
        bindingContext.ModelName = value;
    }

    base.BindModel(bindingContext);
}