EditorFor()可以接受一个object additionalViewData参数,典型的填充方法如下:
EditorFor(model => model.PropertyName, new { myKey = "myValue" })
如何在自定义Helper中检查additionalViewData的内容、添加或附加到键的现有值等?
我尝试过这些方法:
Dictionary<string, object>()并添加/追加值:不工作,因为它看起来像EditorFor在MVC中的实现使用新的RouteValueDictionary(additionalViewData),它将字典嵌入到字典中new RouteValueDictionary(additionalViewData),但与上面的问题相同(或非常类似)我也很乐意“你做错了”--也许我错过了一种更简单的方法。记住,我要做的是编写一个可重用的helper,并将一些值添加到additionalViewData中,以供自定义视图使用。有些值依赖于属性中的元数据,因此它并不像使用一堆不同的模板那么容易。
用我正在做的事情的例子来更新:
public static MvcHtmlString myNullableBooleanFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> choice, string templateName, object additionalViewData)
{
ModelMetadata metadata = ModelMetadata.FromLambdaExpression(choice, htmlHelper.ViewData);
/*
here need to add to additionalViewData some key values among them:
{ propertyName, metadata.PropertyName }
*/
StringBuilder sb = new StringBuilder();
sb.AppendLine(htmlHelper.EditorFor(choice, templateName, additionalViewData).ToString());
MvcHtmlString validation = htmlHelper.ValidationMessageFor(choice);
if (validation != null)
sb.AppendLine(validation.ToString());
return new MvcHtmlString(sb.ToString());
}更新当我将匿名对象转换为Dictionary<string, object>()并将该字典传递给EditorFor()时发生的事情
我在Razor视图中放置了一个断点,并检查了ViewData。似乎传入EditorFor()的字典是放在另一个Dictionary<string, object>()中的。在“立即窗口”中,ViewData如下所示:
ViewData.Keys
Count = 4
[0]: "Comparer"
[1]: "Count"
[2]: "Keys"
[3]: "Values"你看字典里面有字典的内容吗?是的,实际数据在内部字典中,但这并不令人意外,这是行不通的。
额外的赏金。
发布于 2011-06-22 09:15:15
RouteValueDictionary使用TypeDescriptor基础结构(TypeDescriptor.GetProperties(obj))来反映additionalViewData对象。由于这个基础结构是可扩展的,所以您可以创建一个实现ICustomTypeDescriptor的类,并提供您选择的假属性,例如基于内部字典。在下一篇文章中,您将找到一个实现:具有此实现的http://social.msdn.microsoft.com/Forums/en/wpf/thread/027cb000-996e-46eb-9ebf-9c41b07d5daa,您可以轻松地添加具有任意名称和值的"properties“,并将其作为addtionalViewData对象传递。要从初始对象获取现有属性,可以使用与MVC稍后所做的相同的方法,调用TypeDescriptor.GetProperties,枚举属性并获取属性的名称和值,并将它们添加到新的“对象”中。
https://stackoverflow.com/questions/6296583
复制相似问题