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-17 18:33:20
如果我正确理解,您将尝试迭代匿名类型的属性。如果是:如何在C#中迭代匿名对象的属性?
编辑,好的,这不仅仅是。这让我感到很困扰,因为我喜欢C#,它不允许我做我也喜欢的事情。因此,这里有一个解决方案,如果您使用的是C# 4,但它很麻烦,并且会解决我遇到的类似问题,但可能不太适合您:
// Assume you've created a class to hold commonly used additional view data
// called MyAdditionalViewData. I would create an inheritance hierarchy to
// contain situation-specific (area-specific, in my case) additionalViewData.
class MyAdditionalViewData
{
public string Name { get; set; }
public string Sound { get; set; }
}
/* In your views */
// Pass an instance of this class in the call to your HTML Helper
EditorFor(model => model.PropertyName,
new { adv = new MyAdditionalViewData { Name = "Cow", Sound = "Moo" } }) ;
/* In your HTML helper */
// Here's the C# 4 part that makes this work.
dynamic bovine = new ExpandoObject();
// Copy values
var adv = x.adv;
if (adv.Name != null) bovine.Name = adv.Name;
if (adv.Sound != null) bovine.Sound = adv.Sound;
// Additional stuff
bovine.Food = "Grass";
bovine.Contents = "Burgers";
// When the MVC framework converts this to a route value dictionary
// you'll get a proper object, not a dictionary within a dictionary
var dict = new RouteValueDictionary(bovine);一定有更好的办法。
发布于 2012-02-22 18:00:08
在我的例子中,我有一个布尔字段的编辑器,我想成为一个是/否的无线电。我使用additionalViewData属性将yes/no文本设置为本地化。好像对我很管用!
下面是我的自定义editorFor的代码:
@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})发布于 2011-06-22 21:16:43
您是否尝试过将数据添加到
helper.ViewData[xxx] = yyy;ViewData集合是ViewContext的一个全局集合,所以我认为只要将它添加到全局ViewData中,就可以在EditorTemplate呈现出来时使用。
更多信息:据我了解,additionalViewdata属性只是一种简单的方法,可以在您决定呈现哪个控件之后,动态地向全局ViewData添加一个集合/任何东西。仍然使用相同的上下文集合,与其说是一个不同的对象,不如说是添加到同一个上下文字典的一种晚而干净的方法。
我还没有试过这一点,所以如果我错过了重点,说出来,我就移除答案。
https://stackoverflow.com/questions/6296583
复制相似问题