2010-01-23 2 views
16

Мне было интересно, если можно создать пользовательский строго типизированный помощник HTML в ASP.NET MVC 2? Создание регулярного (read not-strict-typed) помощника является простым, но мне трудно создавать строго типизированные версии. Например, я хотел бы создать DatePickerFor html helper ...Возможно ли создать пользовательский ASP.NET MVC строго типизированный HTML-помощник?

Любые рекомендации или фрагменты будут полезны, Заранее благодарю вас! JP

ответ

14

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

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

@JP как вы получаете значение? например html.DatePicker (x => x.Date), как вы получаете значение x.Date – Omu

1
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.

+0

Эта учетная запись для 'html.DatePickerFor (m => m.User.Birthday)'? (Несколько уровней разыменования?) Похоже, что член '.PropertyName' просто вернет самое последнее имя и не должен ли он использовать все уровни? –

4

Я просто попробовал следующее, чтобы создать строго типизированный помощник 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); 
    } 
Смежные вопросы