1

私の知る限り、クラスにはタイプHtmlHelperのHTML5input要素を生成できる(拡張)メソッドがないため、クラスrangeを拡張して独自のメソッドを実装しようとしています。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方法と同様ですか?TextBoxForhtmlAttributes

4

1 に答える 1

2

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));
}

したがって、使用する前に、匿名オブジェクトから属性ディクショナリを作成する必要があります

于 2013-01-16T06:42:38.893 に答える