首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >EditorFor()和additionalViewData:如何在helper类中添加数据?

EditorFor()和additionalViewData:如何在helper类中添加数据?
EN

Stack Overflow用户
提问于 2011-06-09 17:04:00
回答 5查看 27.6K关注 0票数 17

EditorFor()可以接受一个object additionalViewData参数,典型的填充方法如下:

EditorFor(model => model.PropertyName, new { myKey = "myValue" })

如何在自定义Helper中检查additionalViewData的内容、添加或附加到键的现有值等?

我尝试过这些方法:

  • 转换为Dictionary<string, object>()并添加/追加值:不工作,因为它看起来像EditorFor在MVC中的实现使用新的RouteValueDictionary(additionalViewData),它将字典嵌入到字典中
  • 使用RouteValueDictionary转换为new RouteValueDictionary(additionalViewData),但与上面的问题相同(或非常类似)

我也很乐意“你做错了”--也许我错过了一种更简单的方法。记住,我要做的是编写一个可重用的helper,并将一些值添加到additionalViewData中,以供自定义视图使用。有些值依赖于属性中的元数据,因此它并不像使用一堆不同的模板那么容易。

用我正在做的事情的例子来更新:

代码语言:javascript
运行
复制
    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如下所示:

代码语言:javascript
运行
复制
ViewData.Keys
Count = 4
    [0]: "Comparer"
    [1]: "Count"
    [2]: "Keys"
    [3]: "Values"

你看字典里面有字典的内容吗?是的,实际数据在内部字典中,但这并不令人意外,这是行不通的。

额外的赏金。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-06-17 18:33:20

如果我正确理解,您将尝试迭代匿名类型的属性。如果是:如何在C#中迭代匿名对象的属性?

编辑,好的,这不仅仅是。这让我感到很困扰,因为我喜欢C#,它不允许我做我也喜欢的事情。因此,这里有一个解决方案,如果您使用的是C# 4,但它很麻烦,并且会解决我遇到的类似问题,但可能不太适合您:

代码语言:javascript
运行
复制
    // 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);

一定有更好的办法。

票数 5
EN

Stack Overflow用户

发布于 2012-02-22 18:00:08

在我的例子中,我有一个布尔字段的编辑器,我想成为一个是/否的无线电。我使用additionalViewData属性将yes/no文本设置为本地化。好像对我很管用!

下面是我的自定义editorFor的代码:

代码语言:javascript
运行
复制
@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:

代码语言:javascript
运行
复制
@Html.EditorFor(model => model.IsActive, new {TrueText = @Resources.WebSiteLocalizations.Active, FalseText = @Resources.WebSiteLocalizations.InActive})
票数 11
EN

Stack Overflow用户

发布于 2011-06-22 21:16:43

您是否尝试过将数据添加到

代码语言:javascript
运行
复制
helper.ViewData[xxx] = yyy;

ViewData集合是ViewContext的一个全局集合,所以我认为只要将它添加到全局ViewData中,就可以在EditorTemplate呈现出来时使用。

更多信息:据我了解,additionalViewdata属性只是一种简单的方法,可以在您决定呈现哪个控件之后,动态地向全局ViewData添加一个集合/任何东西。仍然使用相同的上下文集合,与其说是一个不同的对象,不如说是添加到同一个上下文字典的一种晚而干净的方法。

我还没有试过这一点,所以如果我错过了重点,说出来,我就移除答案。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6296583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档