【问题标题】:Custom HtmlHelper method that generates an <input type="range"> HtmlString生成 <input type="range"> HtmlString 的自定义 HtmlHelper 方法
【发布时间】:2013-01-16 04:18:00
【问题描述】:

据我所知,HtmlHelper 类中没有(扩展)方法可以生成 range 类型的 HTML5 input 元素,所以我试图通过扩展 HtmlHelper 类来实现我自己的:

public static class MvcHtmlHelper
{
    public static HtmlString RangeFor<TModel, TProperty>
    (this HtmlHelper<TModel> htmlHelper,
        Expression<Func<TModel, TProperty>> expression,
        object htmlAttributes)
    {
        var name = ExpressionHelper.GetExpressionText(expression);
        var metadata = ModelMetadata.FromLambdaExpression(expression,
                       htmlHelper.ViewData);
        //var min = (string)((ViewDataDictionary<TModel>)htmlAttributes)["min"];
        //var max = (string)((ViewDataDictionary<TModel>)htmlAttributes)["max"];
        //var value = (string)((ViewDataDictionary<TModel>)htmlAttributes)["value"];
        return Range(htmlHelper, min, max, value);
    }

    public static HtmlString Range(this HtmlHelper htmlHelper, 
        string name, string min, string max, string value = "0")
    {
        var builder = new TagBuilder("input");
        builder.Attributes["type"] = "range";
        builder.Attributes["name"] = name;
        builder.Attributes["min"] = min;
        builder.Attributes["max"] = max;
        builder.Attributes["value"] = value;
        return new HtmlString(builder.ToString(TagRenderMode.SelfClosing));
    }
}

我正在尝试模拟现有的TextBoxFor 扩展方法,该方法允许调用者通过匿名对象指定额外的htmlAttributes。但是,我在上面的注释行中收到了 InvalidCastException

谁能指出从匿名htmlAttributes 对象获取值的正确方法(类似于TextBoxFor 处理htmlAttributes 的方式?

【问题讨论】:

    标签: c# asp.net-mvc html lambda


    【解决方案1】:

    InputExtensions.TextBoxFor 处理属性的方式如下:

    public static MvcHtmlString TextBoxFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes)
    {
      return InputExtensions.TextBoxFor<TModel, TProperty>(htmlHelper, expression, (IDictionary<string, object>) HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes));
    }
    

    所以你必须在使用前从异常对象创建属性字典

    【讨论】:

    • 谢谢,我会测试一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 2011-04-06
    相关资源
    最近更新 更多