最终目标是为模型属性呈现一个编辑器模板,该模板属性仅在运行时知道,不会从ViewBag中获取它的值。
如果属性名称匹配, Html.Editor
将使用ViewBag值。我不想要这个,我讨厌这个“功能”。
我希望这有可能以某种方式:
var propName = "MyProperty";
var expression = GiveMeTheExpression();
@Html.EditorFor(expression,"MyEditorTemplate")
如果不是这样,那么渲染编辑器模板的某种方式不使用viewbag值而不是模型的值。我完全没有这样做,如果我不知道观点价值如何:
@Html.Editor(propName, other, arguments)
答案 0 :(得分: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以保持模型状态等。
答案 1 :(得分:0)
为什么不尝试这个?
@Html.EditorFor(x=>x.SomePropertyName)
假设SomePropertyName
是您的模型的属性名称,该属性是您的视图的强类型。
答案 2 :(得分:0)
Shyju 关注强类型对象,如果我理解正确,您需要以下内容:asp.net mvc 3 and dynamic view generation
答案 3 :(得分:0)
我的解决方案是使用@ Html.Editor()方法,将属性名称作为字符串,并使用不太可能在模型对象上找到的ViewBag键。
不理想,但应该运作良好。