Лучшее решение пользовательского htmlhelper, добавьте часть скрипта в ContentPlaceHolder - PullRequest
0 голосов
/ 01 апреля 2011

Я создал htmlhelper,

Мне было интересно, есть ли более аккуратный способ сделать это.Пожалуйста, не стесняйтесь говорить, что я делаю неправильно, ваши предложения приветствуются.

    /// <summary>
    /// Custom jQuery Picker for object
    /// </summary>
    /// <typeparam name="TModel"></typeparam>
    /// <typeparam name="TProperty"></typeparam>
    /// <param name="htmlHelper"></param>
    /// <param name="expression"></param>
    /// <returns></returns>
    public static string DatePickerFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IDictionary<string, object> htmlAttributes)
    {
      //gets name of object
      string fullHtmlFieldName = htmlHelper
                             .ViewContext
                             .ViewData
                             .TemplateInfo
                             .GetFullHtmlFieldName(
                                 ExpressionHelper.GetExpressionText(expression)
                             );
      //returns metadata for object
      var metaData = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
      DateTime date;
      DateTime.TryParse(metaData.Model.ToString(), out date); // will be of type TProperty
      StringBuilder html = new StringBuilder();
      string attributes = "";
      string objectId = fullHtmlFieldName;

      if (htmlAttributes.Count != 0)
      {
        foreach (KeyValuePair<string, object> element in htmlAttributes)
        {
          attributes += element.Key.ToLower() +"=\""+ element.Value+"\" ";
          if (element.Key.ToLower() == "id") objectId = element.Value.ToString();
        }           
      }

      html.Append("<input type=\"text\" name=\"" + fullHtmlFieldName + "\" " + attributes + " ");
      if (date != null) html.Append(" value=\"" + date.ToShortDateString() + "\"");
      html.Append("/>");
      html.Append("<script type=\"text/javascript\">$(document).ready(function() { $('#" + objectId + "').datepicker({rangeSelect: true,changeMonth: true,changeYear: true, firstDay: 1, duration: 'fast'}); });</script>");
      return html.ToString();

Также я хочу спросить, есть ли возможность назначать части кода, которые будут автоматически анализироваться, распределяться по разным ContentPlaceHolders

Например: часть кода скрипта будет отображена внутри следующего ContentPlaceHolder:

<asp:ContentPlaceHolder ID="JavaScript" runat="server" />

1 Ответ

0 голосов
/ 01 апреля 2011

Вместо реализации пользовательского расширения HtmlHelper вы можете использовать Templating и Html.EditorFor (). Я использую их некоторое время без проблем. Вам могут помочь следующие ссылки:

...