Помогите с созданием строго типизированного расширения html helper в Asp.net MVC 2 - PullRequest
1 голос
/ 20 июля 2010

Я пытаюсь создать вспомогательное расширение html строго для средства выбора даты, используя jquery ui datepicker.Я создал расширение со строгой типизацией, которое работает, но сейчас я пытаюсь создать строго типизированное.

Вот что у меня есть:

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 (значение = ноль), но при редактировании средство выбора даты не заполняется значением.

Как получить значение в моем методе расширения DatePickerFor из модели.(Я знаю, что могу просто передать значение другим параметром, но я бы предпочел этого не делать. Плюс это довольно интересно)

Спасибо, Кевин

- РЕДАКТИРОВАТЬ ------Что у меня есть в конечном итоге ---------- Примечание: это не было полностью протестировано, но, похоже, работает прямо сейчас.

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скрипт выбора даты.Что такое «jqueryDatePicker» и почему он добавлен как класс?Вместо того чтобы вызывать $ (# ...). Datepicker () для каждой страницы, я добавляю этот класс, и есть некоторый javascript, который найдет этот класс и вызовет .datepicker () для вас.

1 Ответ

0 голосов
/ 20 июля 2010

Должно работать что-то вроде следующего:

var input = myFunc(htmlHelper.ViewData.Model)
...