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