【问题标题】:POST data to action using HtmlFieldPrefix yields empty model使用 HtmlFieldPrefix 将数据发布到操作会产生空模型
【发布时间】:2019-06-23 19:43:27
【问题描述】:

在我的应用程序中,我有几个模态窗口。它们中的每一个都采用相同的局部视图和相同的视图模型,但显示其他数据。为此,我生成了一个动态的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

但是,这不起作用,因为在 POST 时绑定前缀也是 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 的警告。

【问题讨论】:

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


    【解决方案1】:

    在我的模型中使用自定义模型绑定器找到了答案:

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

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-18
      相关资源
      最近更新 更多