【发布时间】:2011-09-11 21:36:21
【问题描述】:
EditorFor() 可以采用object additionalViewData 参数,典型的填充方法如下:
EditorFor(model => model.PropertyName, new { myKey = "myValue" })
如何在自定义 HTML Helper 中检查 AdditionalViewData 的内容、添加或附加到现有值的键等?
我尝试了这些方法:
- 转换为
Dictionary<string, object>()并添加/附加值:不起作用,因为 MVC 中 EditorFor 的实现似乎使用了新的 RouteValueDictionary(additionalViewData),它将字典嵌入字典中 - 使用
new RouteValueDictionary(additionalViewData)转换为 RouteValueDictionary,但问题与上述相同(或非常相似)
我也对“你做错了”持开放态度——也许我错过了一种更简单的方法。请记住,我要做的是编写一个可重用的 HTML 帮助程序,并将一些值添加到 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"
看看字典里面是如何包含字典的内容的?是的,实际数据在那个内部字典中,但不出所料,这不起作用。
增加了赏金。
【问题讨论】:
-
听起来你根本没有写 HtmlHelper。您能否详细解释一下您的目标是什么?
-
我添加了一个示例——它是一个使用 EditorFor 的 HTML 助手,以便调用者可以指定模板。类似于 TextBoxFor() 或其他 HTML 助手的源代码。
-
我已经找到了另一种方法来做到这一点(回到 RadioButtonFor()),因为我不再需要覆盖一些 HTML 输出。所以我会说这个例子是一个例子,但不是我会使用的东西。我仍然很好奇在 HTML 帮助器中的 AdditionalViewData 中添加/删除/替换值是否是一种现实的方法。
-
您是否能够将对象转换为
Dictionary<string, object>?我不太清楚 -
@David 我能够毫无问题地将对象转换为
Dictionary<string, object>,但是当该对象被传递给EditorFor()然后发射到视图时(使用Razor,输入一些代码并捕获它与调试器一起)它被错误地发出:它是一个Dictionary<string, object>(),这是正确的,但是该字典中有我们想要的实际字典。我的猜想是 EditorFor 中的代码无法判断它已经是Dictionary<string, object>()并再次对其进行重新词典。我在问题的底部更新了有关此案例的更多详细信息。
标签: asp.net-mvc asp.net-mvc-3 views anonymous-types