Использование EditorTemplate с RenderPartial - PullRequest
3 голосов
/ 22 декабря 2011

Есть ли приемлемый способ визуализации EditorTemplate с использованием RenderPartial?

Я вложил много работы в EditorTemplate, который использовал бы автозаполнение пользовательского интерфейса JQuery, чтобы позволить пользователю выбирать из списка компаний.(Он использует помощник HTML, чтобы гарантировать, что правильные библиотеки JS и правила CSS включены в «правильные» места на сгенерированной веб-странице.)

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

Этот код выполняет задачу, но в некотором смысле я могу рассматривать только хак.

@using(Html.BeginForm()) {
    ViewData.TemplateInfo.HtmlFieldPrefix = "CompanyName";
    Html.RenderPartial("~/Views/Shared/EditorTemplates/Company.cshtml", string.Empty);
    <input type="submit" value='Filter' />
}

Поскольку яне используя EditorFor, здесь нет параметра «name», поэтому отображаемое поле ввода - это просто HtmlFieldPrefix для «CompanyName».Автозаполнение работает, и я могу отправить форму и отфильтровать данные.Но это решение кажется небрежным и хрупким.У кого-нибудь есть идея получше?

1 Ответ

0 голосов
/ 29 декабря 2011

Я переместил многократно используемые элементы управления в помощник в app_code и сделал шаблон редактора маленькой оберткой для вызова помощника.

Мой editorTemplate для DateTime выглядит следующим образом:

@model DateTime?
@using System.Globalization
@{
    var name = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldName(""));
    var id = MvcHtmlString.Create(ViewData.TemplateInfo.GetFullHtmlFieldId(""));
    var value = Model.HasValue && Model.Value > DateTime.MinValue ? string.Format("{0:d}", Model) : "";
}
<span class="edit">
    @Editor.DateTime(id, name, value)
</span>

И у меня есть и Editor.cshtml в app_code, который содержит:

@helper DateTime(IHtmlString id, IHtmlString name, string value) {
    <input type="text" class="editor-date" id="@id" name="@name" value="@value" />
    if (HttpContext.Current.Items["editor-date"] == null) {
        HttpContext.Current.Items["editor-date"] = new object();

    <script type="text/javascript">
        $(function () {
            $(".editor-date").datepicker({ dateFormat: 'd/m/yy' });
        });
    </script>
    }
}

Так что я могу использовать свой редактор дат из EditorFor или любым другим способом, в то же время включив скрипт взапустите его только один раз, и у вас есть весь код для изменения в одном месте.

...