Можно ли создать специальный ASP.NET MVC строго типизированный HTML Helper? - PullRequest
16 голосов
/ 23 января 2010

Мне было интересно, возможно ли создать настраиваемый строго типизированный HTML Helper в ASP.NET MVC 2? Создать обычный (читай не строго типизированный) помощник просто, но у меня возникают трудности при создании строго типизированных версий. Например, я хотел бы создать помощник DatePickerFor HTML ...

Буду очень признателен за любые указания или фрагменты, Заранее спасибо! JP

Ответы [ 3 ]

14 голосов
/ 23 января 2010

Хорошо, я понял это (и это было довольно просто ...). Отправка одной из моих перегрузок на случай, если кто-то еще столкнется с этим вопросом.

public static string DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel, TProperty>> expression)
  where TModel : class
{
    var inputName = ExpressionHelper.GetExpressionText(expression);
    return htmlHelper.DatePicker(inputName);
}
4 голосов
/ 29 сентября 2010

Я только что попробовал следующее, чтобы создать строго типизированный помощник CKEditor, и, похоже, он работает безупречно. Это предполагает, что вы уже включили jquery и необходимые сценарии ckeditor в ваш проект. Возможно, было бы неплохо взглянуть и на настройку конфигурации ckeditor, но это удовлетворило мои текущие потребности.

    public static MvcHtmlString CkEditor(this HtmlHelper htmlHelper, string name, string value, object htmlAttributes)
    {
        var output = htmlHelper.TextArea(name, value, htmlAttributes).ToString();
        output += string.Format("<script type=\"text/javascript\">$(document).ready(function(){{ $('#{0}').ckeditor(); }});</script>", name);

        return MvcHtmlString.Create(output);
    }

    public static MvcHtmlString CkEditor(this HtmlHelper htmlHelper, string name, string value)
    {
        return htmlHelper.CkEditor(name, value, null);
    }

    public static MvcHtmlString CkEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, object htmlAttributes) where TModel : class
    {
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
        return htmlHelper.CkEditor(metadata.PropertyName, metadata.Model as string, htmlAttributes);
    }

    public static MvcHtmlString CkEditorFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression) where TModel : class
    {
        return htmlHelper.CkEditorFor(expression, null);
    }
1 голос
/ 09 августа 2010
public static string DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper,Expression<Func<TModel, TProperty>> expression)
  where TModel : class
{
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
    return htmlHelper.DatePicker(metadata.PropertyName);
}

Я использовал ModelMetadata, это также будет работать, если вы создадите шаблон datetime для datepicker.

...