public class AnotherViewModel
{
public string Name { get; set; }
}
public class MyViewModel
{
public string Name { get; set; }
public AnotherViewModel Child { get; set; }
public AnotherViewModel Child2 { get; set; }
}
在视图中,我可以使用以下代码呈现一个局部内容:
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
在我要做的部分中
<%= Html.TextBox("Name", Model.Name) %>
or
<%= Html.TextBoxFor(x => x.Name) %>
然而,问题在于两者都会呈现为name="Name",而我需要使用name="Child.Name"才能使模型绑定器正常工作。或者,当我使用相同的局部视图呈现第二个属性时,需要使用name="Child2.Name"。
我该如何使我的局部视图自动识别所需的前缀?我可以将其作为参数传递,但这太麻烦了。当我想要递归地呈现它时,情况变得更糟。是否有一种方法可以使用前缀呈现局部视图,或者更好的是,自动识别调用lambda表达式的方式呈现局部视图,以便
<% Html.RenderPartial("AnotherViewModelControl", Model.Child) %>
会自动将正确的“Child.”前缀添加到生成的名称/ID字符串中吗?
我可以接受任何解决方案,包括第三方视图引擎和库——我实际上使用了Spark View Engine(我使用它的宏“解决”问题)和MvcContrib,但在那里没有找到解决方案。XForms、InputBuilder、MVC v2——任何提供此功能的工具/见解都很棒。
目前,我考虑自己编写代码,但这似乎是浪费时间,我无法相信这种琐碎的东西还没有被实现。
可能存在许多手动解决方案,欢迎所有这些解决方案。例如,我可以强制我的局部视图基于IPartialViewModel< T > { public string Prefix; T Model; },但我更喜欢一些现有/已批准的解决方案。
更新:有一个类似的问题没有答案在这里。
helper.ViewData.TemplateInfo.HtmlFieldPrefix
的旧前缀中,格式为{oldprefix}.{newprefix}
。 - Ivan Zlatevnew ViewDataDictionary(((HtmlHelper)helper).ViewData)
替换了new ViewDataDictionary(helper.ViewData)
。你觉得这样有什么问题吗? - Pat Newellstring oldPrefix = helper.ViewData.TemplateInfo.HtmlFieldPrefix; if (oldPrefix != "") name = oldPrefix + "." + name;
。 - kennethc