1

最终目标是为模型属性渲染一个编辑器模板,该模型属性仅在运行时才知道,不会从 ViewBag 中获取它的值。

Html.Editor如果属性名称匹配,将使用 ViewBag 值。我不想要这个,我讨厌这个“功能”。

我希望这是可能的:

var propName = "MyProperty";
var expression = GiveMeTheExpression();
@Html.EditorFor(expression,"MyEditorTemplate")

如果不是这样,那么可以通过某种方式呈现编辑器模板,而不使用 viewbag 值而不是模型的值。如果我能以某种方式忽略 VIEWBAG 值,我完全可以这样做:

@Html.Editor(propName, other, arguments)
4

4 回答 4

1

您可能必须将 Html.Partial 与自定义 ViewDataDictionary 一起使用。

object knownAtRuntime = ViewBag.ObjectName; // Adapt to your solution
string templateName = String.Concat("EditorTemplates/", knownAtRuntime.GetType().Name);            

@Html.Partial(templateName, knownAtRuntime, new ViewDataDictionary(knownAtRuntime));

注意:我把这个例子简单地说明了核心概念,但如果你愿意,当然可以扩展它来阅读UIHintAttribute等。

注意 2:您可能还希望将值从 Html.ViewData 复制到新的 ViewDataDictionary 以保持您的模型状态等。

于 2012-09-14T11:27:25.807 回答
0

Shyju考虑强类型对象,如果我理解正确,您需要类似:asp.net mvc 3 和动态视图生成

于 2012-09-14T06:40:58.423 回答
0

我的解决方案是使用属性名称为字符串的 @Html.Editor() 方法,并使用在模型对象上不太可能找到的 ViewBag 键。

不理想,但应该很好用。

于 2012-09-15T12:27:01.010 回答
0

为什么不试试这个?

@Html.EditorFor(x=>x.SomePropertyName)

假设SomePropertyName是您的模型的属性的名称,该名称是强类型到您的视图的。

于 2012-09-14T04:29:38.533 回答