Я создал 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" />