EditorFor() 可以采用 object additionalViewData
填充的典型方法的参数类似于:EditorFor(model => model.PropertyName, new { myKey = "myValue" })
如何在自定义 HTML Helper 中检查 AdditionalViewData 的内容、添加或附加到键的现有值等?
我试过这些方法:
Dictionary<string, object>()
和添加/附加值:不起作用,因为 MVC 中 EditorFor 的实现使用 new RouteValueDictionary(additionalViewData) 将字典嵌入字典 new RouteValueDictionary(additionalViewData)
转换为 RouteValueDictionary但这与上面有相同(或非常相似)的问题我也对“你做错了”持开放态度——也许我错过了一种更简单的方法。请记住,我要做的是编写一个可重用的 HTML 帮助程序,并将一些值添加到 AdditionalViewData 以供自定义 View 使用。一些值依赖于属性的元数据,所以它并不像使用一堆不同的模板那么容易。
更新我正在做的例子:
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 View 中设置了一个断点并检查了 ViewData。字典似乎传递到
EditorFor()
被放入另一个 Dictionary<string, object>()
.在“即时窗口”中,ViewData 如下所示:ViewData.Keys
Count = 4
[0]: "Comparer"
[1]: "Count"
[2]: "Keys"
[3]: "Values"
看看字典中如何包含字典的内容?是的,实际数据在那个内部字典中,但不出所料,这不起作用。
增加了赏金。
最佳答案
就我而言,我有一个 bool 字段的编辑器,我想成为一个是/否 radio 。我使用 AdditionalViewData 属性来设置是/否的文本进行本地化。似乎对我很有用!
这是我的自定义编辑器的代码:
@model bool?
@{
var yes = ViewBag.TrueText ?? @Resources.WebSiteLocalizations.Yes;
var no = ViewBag.FalseText ?? @Resources.WebSiteLocalizations.No;
}
<div class="title">
@Html.LabelFor(model => model)
@Html.RequiredFor(model => model)
</div>
<div class="editor-field">
@Html.RadioButton("", "True", (Model.HasValue && Model.Value))@yes
<br />
@Html.RadioButton("", "False", (Model.HasValue && Model.Value == false))@no
<br />
@Html.ValidationMessageFor(model => model)
</div>
@Html.DescriptionFor(model => model)
这是您如何调用此自定义 EditorFor:
@Html.EditorFor(model => model.IsActive, new {TrueText = @Resources.WebSiteLocalizations.Active, FalseText = @Resources.WebSiteLocalizations.InActive})
关于asp.net-mvc - EditorFor() 和附加 View 数据 : how to add data in helper class?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6296583/