2012-09-14 143 views
1

最终目标是为模型属性呈现编辑器模板,仅在运行时才知道该模板属性不会从ViewBag中获取它的值。如何使用属性名称呈现模型属性的编辑器模板

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

我希望这是可能以某种方式:

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

如果不是这则有些渲染编辑模板而不用于代替模型的值viewbag值的方式。我完全可以这样做,如果我可以忽略VIEWBAG值有些东西:

@Html.Editor(propName, other, arguments) 

回答

0

为什么不试试这个?

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

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

+0

“...为模型属性渲染一个编辑器模板,仅在运行时才知道...” –

0

Shyju取约强类型的对象,如果我理解正确的话,你需要像:asp.net mvc 3 and dynamic view generation

+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,让您的ModelState等

0

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

不理想,但应该很好。

相关问题