在我的应用程序中,我有几个模式窗口。它们中的每一个都采用相同的局部视图和相同的视图模型,但显示其他数据。为此,我生成了一个动态HtmlFieldPrefix
as,这样就不会有多个同名的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)
然而,这不起作用,因为绑定前缀在POSTing时也是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的警告。
发布于 2019-06-24 18:26:12
通过在我的模型中使用自定义模型绑定器找到了答案:
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);
}
https://stackoverflow.com/questions/56727236
复制相似问题