asp.net-mvc - EditorFor() 和附加 View 数据 : how to add data in helper class?

标签 asp.net-mvc asp.net-mvc-3 views anonymous-types

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/

    相关文章:

    c# - ImageResizer - 转换 PSD 文件时出错 - System.ArgumentException : Parameter is not valid

    Navicat 中的 MySQL View - 如何定义 'primary key'?

    asp.net-mvc - 寻找对呈现局部 View 的 Controller 扩展进行单元测试的方向

    View 和 $this 中的 Cakephp 助手

    iphone - 保持 ViewController 处于相同状态/保持它在后台加载?

    asp.net-mvc - asp.net mvc - 检查调用了什么 Controller 和方法?

    c# - ASP.NET MVC : How to default to a page given certain condition?

    jquery - 使用 iframe 下载文件在 Iphone/Ipad 中不起作用

    c# - 如何在 LINQ 中连接表并在 MVC 中返回列表

    c# - 组合 Lambda 表达式