@Html.DatePickerFor с загрузочным средством выбора даты с использованием 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>

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


person Robert    schedule 05.08.2013    source источник


Ответы (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));

    }
person Robert    schedule 06.08.2013
comment
Просто подсказка: начиная с MVC4 вы можете использовать Html.IdFor и Html.NameFor вместо использования ExpressionHelper. ;-) - person Moeri; 25.08.2013