【问题标题】:Help with creating strongly typed html helper extension in Asp.net MVC 2帮助在 Asp.net MVC 2 中创建强类型的 html 助手扩展
【发布时间】:2011-03-18 14:27:12
【问题描述】:

我正在尝试使用 jquery ui datepicker 为日期选择器创建一个强类型的 html 帮助器扩展。我创建了一个非强类型的扩展,它可以工作,但现在我正在尝试创建它的强类型。

这是我所拥有的:

public static MvcHtmlString DatePicker(this HtmlHelper html, string name, object date)
    {
        var inputTag = new TagBuilder("input");
        inputTag.MergeAttribute("id", name);
        inputTag.MergeAttribute("name", name);
        inputTag.MergeAttribute("type", "text");

        if (date != null)
        {
            string dateValue = String.Empty;
            if ((date is DateTime? ||date is DateTime) && (DateTime)date != DateTime.MinValue)
            {
                dateValue = ((DateTime)date).ToShortDateString();
            }
            else if (date is string)
            {
                dateValue = (string)date;
            }

            inputTag.MergeAttribute("value", dateValue);
        }

        return MvcHtmlString.Create(inputTag.ToString());
    }

这有效并且将保持该值。这是我的强类型扩展。

public static MvcHtmlString DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        Func<TModel, TProperty> myFunc = expression.Compile();
        var value = myFunc(???);

        var inputName = ExpressionHelper.GetExpressionText(expression);
        return htmlHelper.DatePicker(inputName, value);
    }

如果我为值传递 null(值 = null),但在编辑时,日期选择器没有填充值。

如何从模型中获取 DatePickerFor 扩展方法中的值。 (我知道我可以通过另一个参数传入值,但我不希望这样做。另外,这很有趣)

谢谢 凯文

--EDIT------我的最终结果---------- 注意:这尚未经过全面测试,但现在似乎可以正常工作。

public static MvcHtmlString DatePicker(this HtmlHelper html, string name, object date)
    {
        var inputTag = new TagBuilder("input");
        inputTag.MergeAttribute("id", name);
        inputTag.MergeAttribute("name", name);
        inputTag.MergeAttribute("type", "text");
        inputTag.AddCssClass("jqueryDatePicker");

        if (date != null)
        {
            string dateValue = String.Empty;
            if ((date is DateTime? ||date is DateTime) && (DateTime)date != DateTime.MinValue)
            {
                dateValue = ((DateTime)date).ToShortDateString();
            }
            else if (date is string)
            {
                dateValue = (string)date;
            }

            inputTag.MergeAttribute("value", dateValue);
        }

        return MvcHtmlString.Create(inputTag.ToString());
    }

    public static MvcHtmlString DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        Func<TModel, TProperty> methodCall = expression.Compile();
        TProperty value = methodCall(htmlHelper.ViewData.Model);
        var inputName = ExpressionHelper.GetExpressionText(expression);

        return htmlHelper.DatePicker(inputName, value);
    }

这是使用 JQuery UI datepicker 脚本。什么是“jqueryDatePicker”,为什么将它作为一个类添加?我没有在每个页面上调用 $(#...).datepicker(),而是添加了这个类,并且有一些 javascript 会找到这个类并为你调用 .datepicker()。

【问题讨论】:

    标签: asp.net asp.net-mvc-2 strong-typing


    【解决方案1】:

    类似下面的东西应该可以工作:

    var input = myFunc(htmlHelper.ViewData.Model)
    

    【讨论】:

    • 是的,非常感谢。我有它的工作。如果其他人想使用,我会发布我的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多