我在覆盖Object.cshtm
模板时发现了一种奇怪的行为.该Object.cshtm
迭代的Model
特性和"发送"他们合适的模板进行渲染.
foreach (var prop in ViewData.ModelMetadata.Properties) { @Html.Editor(prop.PropertyName, "MyCustomTemplateCollection" + prop.TemplateHint) //TemplateHint set by custom attributes }
一切运作良好:模板切换到适当的类型模板,在我可以访问Metadata
属性的内部:
string name = ViewData.ModelMetadata.PropertyName; string controllerName = ViewData.ModelMetadata.ContainerType.Name; //render property accordingly (using the property information)
但是,如果由于某种原因ViewBag
包含与其中一个属性同名的(动态)Model
属性,ModelMetadata
则不会完全生成; 至少上述ModelMetadata
属性设置为null
.例如,如果在我设置的控制器中ViewBag.ProductName = myModel.ProductName;
,当ProductName
属性进入其相应的模板时,元数据不包含"预期"值.
该解决方案很简单:如果,不管出于什么原因,物业需要保存的ViewBag
,它必须以不同的名称保存.
我的问题是:如何EditorHelper
将数据传递给模板?我不希望这样,ViewData
并ViewBag
"分享"这些信息.与检查快速监视我可以看到在Non-Public members
中的ViewBag
一个ViewData
这似乎是一样的性质,可以说,一般可用ViewData
对象.为什么不完全独立?