我有一个使用Ajax在页面中添加的多个局部视图。我开始使用前缀来避免部分视图之间的名称冲突。
在视图或控制器中,我设置了前缀:
ViewData.TemplateInfo.HtmlFieldPrefix = "MyPartialPrefix";
在视图中,我在使用默认模板或@Html.EditorFor
和@Html.IdFor
时使用@Html.NameFor
来获取正确的名称和ID。当我需要一个不在模型中的ID(我需要使用javascript访问的div)时,我使用@Html.Id("SomeRandomElement")
。
此解决方案完美无缺,直到我决定不止一次使用相同的局部视图。我的自然反射是将静态前缀转换为随机生成的GUID。但是,一些(大多数)部分视图具有表单,这意味着它们最终会被发送到必须绑定模型的控制器操作。使用静态前缀,我可以使用[Bind(Prefix = "MyPartialPrefix")]
,但如果我切换到GUID,我需要在运行时找到该前缀。我不知道应该在哪里以及如何做。
我的想法是制作一个自定义的ModelBinder来检查名为" ModelPrefix"的字段。与请求一起发送并将其设置为绑定前缀。我在自定义模型绑定器中的变量中得到了前缀,但我不知道如何处理它。没有人看到有"前缀"绑定上下文中的字段就像我最初预期的那样。我一直在寻找ASP.NET MVC源代码来查找BindAttribute的前缀是如何处理的,并且我在代码中越来越深入,直到我甚至不知道我&# 39;我再看了。
public class PrefixModelBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var prefix = bindingContext.ValueProvider.GetValue("prefix");
// What do I do at this point?
return base.BindModel(controllerContext, bindingContext);
}
}