2013-08-05 4 views
0

Так что я пытаюсь добавить расширение для даты начальной загрузки подборщика:@ Html.DatePickerFor с начальной загрузки DatePicker с использованием TagBuilder

public static MvcHtmlString DatePickerFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression) 
    { 
     var propertyName = ExpressionHelper.GetExpressionText(expression); 
     var controlGroupWrapper = new TagBuilder("div"); 
     controlGroupWrapper.AddCssClass("control-group"); 

     controlGroupWrapper.InnerHtml += htmlHelper.LabelFor(expression, new Dictionary<string, object> { { "class", "control-label" } }).ToHtmlString(); 

     var controlWrapper = new TagBuilder("div"); 
     controlWrapper.AddCssClass("controls"); 

     var datePicker = new TagBuilder("div"); 
     datePicker.AddCssClass("input-append date datepicker"); 
     datePicker.MergeAttribute("data-date-format", "dd/mm/yyy"); 

     var addOnWrapper = new TagBuilder("span"); 
     addOnWrapper.AddCssClass("add-on"); 

     var iconThWrapper = new TagBuilder("i"); 
     iconThWrapper.AddCssClass("icon-th"); 

     addOnWrapper.InnerHtml += iconThWrapper.ToString(TagRenderMode.Normal); 



     var value = GetPropValue(htmlHelper.ViewData.Model, propertyName); 
     var innerHtml = htmlHelper.EditorFor(expression).ToHtmlString(); 
     innerHtml += addOnWrapper.ToString(TagRenderMode.Normal); 

     var datepickerInnerHtml = datePicker.ToString(TagRenderMode.Normal); 
     datepickerInnerHtml += innerHtml; 

     controlWrapper.InnerHtml += datepickerInnerHtml; 

     controlGroupWrapper.InnerHtml += controlWrapper.ToString(TagRenderMode.Normal); 



     return MvcHtmlString.Create(controlGroupWrapper.ToString(TagRenderMode.Normal)); 

    } 

Это то, что я есть и что мне нужно:

<div class="control-group"> 
      <label class="control-label" for="Date">@Model.DisplayName</label> 
      <div class="controls"> 
       <div class="input-append date datepicker" data-date-format="dd/mm/yyyy"> 
        <input name="@Model.Name" value="@Model.Value" class="span2" type="text"/> 
        <span class="add-on"><i class="icon-th"></i></span> 
       </div> 
      </div> 
     </div> 

То, что я на самом деле получить на экране:

<div class="control-group"> 
    <label class="control-label" for="StartDate_Value">Value</label> 
    <div class="controls"> 
     <div class="input-append date datepicker" data-date-format="dd/mm/yyy"> 
     <div class="datepicker datepicker-inline" style="display: block;"> 
      <div class="datepicker-days" style="display: block;"> 
       <table class=" table-condensed"> 
        <thead> 
      div> 
     </div> 
    </div> 
    <input class="text-box single-line" id="StartDate_Value" name="StartDate.Value" type="text" value=""> 
    <span class="add-on"> 
     <i class="icon-th"></i> 
    </span> 
</div> 

Как вы можете видеть, что материал не выстраиваются в очередь, и я получаю реальную д atepicker div на экране вместо вставленного через JS. У кого-нибудь есть идеи о том, что я делаю неправильно?

ответ

1

Для тех из вас, кто пытается написать свой собственный @ Html.DatePickerFor() Вот что я сделал, чтобы заставить его работать.

public static MvcHtmlString DatePickerFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> expression) 
    { 
     var propertyName = ExpressionHelper.GetExpressionText(expression); 
     var controlGroupWrapper = new TagBuilder("div"); 
     controlGroupWrapper.AddCssClass("control-group"); 

     controlGroupWrapper.InnerHtml += htmlHelper.LabelFor(expression, new Dictionary<string, object> { { "class", "control-label" } }).ToHtmlString(); 

     var controlWrapper = new TagBuilder("div"); 
     controlWrapper.AddCssClass("controls"); 

     var datePicker = new TagBuilder("div"); 
     datePicker.AddCssClass("input-append date datepicker"); 
     datePicker.MergeAttribute("data-date-format", "dd/mm/yyy"); 

     var spanWrapper = new TagBuilder("span"); 
     spanWrapper.AddCssClass("add-on"); 

     var iconThWrapper = new TagBuilder("i"); 
     iconThWrapper.AddCssClass("icon-th"); 

     GetPropValue(htmlHelper.ViewData.Model, propertyName); 
     var inputTag = htmlHelper.EditorFor(expression).ToHtmlString(); 


     spanWrapper.InnerHtml += iconThWrapper.ToString(TagRenderMode.Normal); 


     datePicker.ToString(TagRenderMode.Normal); 
     datePicker.InnerHtml += inputTag + spanWrapper.ToString(TagRenderMode.Normal); ; 

     controlWrapper.InnerHtml += datePicker.ToString(TagRenderMode.Normal); 

     controlGroupWrapper.InnerHtml += controlWrapper.ToString(TagRenderMode.Normal); 



     return MvcHtmlString.Create(controlGroupWrapper.ToString(TagRenderMode.Normal)); 

    } 
+0

Только намек: с MVC4 вы можете использовать Html.IdFor и Html.NameFor вместо того, чтобы использовать ExpressionHelper. ;-) – Moeri

Смежные вопросы