Создание EditorTemplate для строковых свойств ASP.NET MVC4

Когда я использую помощник Html.EditorFor в своей форме, я хочу иметь возможность настраивать внешний вид тега, поэтому я определил EditorTemplate, чтобы иметь возможность делать именно это. Вот так, на мой взгляд, выглядит моя форма:

@model Models.SimpleUserClass
@{
    ViewBag.Title = "Create User";
}

<div class="row">
    <div class="col-lg-6" id="FromPlaceHoler">

        @using (Html.BeginForm("CreateUser", "Users"))
        {

            <fieldset>
                <legend>Create One Way Trip</legend>

                <div class="editor-label">
                    @Html.LabelFor(model => model.UserName)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.UserName)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.UserSurname)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.UserSurname)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.UserAge)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.UserAge)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(model => model.UserGender)
                </div>
                <div class="editor-field">
                    @Html.EditorFor(model => model.UserGender)
                </div>

                <p>
                    <input type="submit" value="Create" />
                </p>
            </fieldset>
        }
    </div>
</div>

Такие свойства, как UserName и Surname, относятся к типу String, поэтому в моей общей папке я создал папку EditorTemplates и создал файл String.cshtml, чтобы определить способ, которым должен выглядеть редактор для String. При запуске теста формы кажется, что она работает хорошо, поскольку создаваемые поля ввода имеют вид, который я указал - проблема в том, что когда я отправляю форму с использованием этих настраиваемых полей ввода, mvc не может сопоставить поля моей формы с моей моделью. Причиной этого являются свойства, необходимые тегу для поддержки этой привязки к моделям. Вот пример:

Вот мой код в String.cshtml EditorTemplate:

<input type="text" class="form-control">

а при использовании EditorFor по умолчанию без настройки он генерирует следующую разметку:

<input data-val="true" data-val-required="The User Name field is required." id="UserName" name="UserName" type="text" value="" />

Как мы видим выше, в моем коде нет свойств id и name, которые коррелируют с именем моих свойств в моем классе и используются для привязки значений к моему классу. Итак, как мне изменить код в String.cshtml, чтобы включить эти свойства и динамически установить их значения? поскольку его следует использовать для различных свойств в моем классе?


person Marnus Steyn    schedule 07.04.2015    source источник
comment
Для такой простой вещи вам не нужен EditorTemplate. Почему бы вам просто не присвоить класс Html.TextBoxFor?   -  person ataravati    schedule 07.04.2015


Ответы (2)


Вы можете использовать это:

@model string

@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue,
                new
                {
                    @class = "form-control",
                    placeholder = ViewData.ModelMetadata.Watermark 
                                  ?? ViewData.ModelMetadata.DisplayName 
                                  ?? ViewData.ModelMetadata.PropertyName
                })

Удалите заполнитель, если он вам не нужен.

Re: заполнитель, это подсказка пользователю, что можно ввести во входные данные. Вы можете украсить свойства вашей модели аннотациями:

[Display(Name = "Client")]
public int ClientId { get; set; }

[Display(Prompt = "Please enter mailing Name")]
public string MailingName { get; set; }

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

person Yan F.    schedule 07.04.2015
comment
Вау, это здорово! Поскольку я новичок в mvc, это действительно полезный фрагмент кода, которым вы здесь поделились. Только один вопрос: на какой заполнитель вы ссылаетесь, где в разметке он отображается? - person Marnus Steyn; 07.04.2015

Вместо использования EditorTemplate для String просто используйте TextBoxFor следующим образом:

@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })
person ataravati    schedule 07.04.2015
comment
Это правильный ответ, однако я не согласен с вашим анализом того, почему создавать шаблон редактора для типа String - не лучшая идея. Я не вижу ничего плохого в наличии настраиваемого шаблона редактора строк по умолчанию. Если вам понадобится несколько шаблонов редактора для типа String в будущем (например, вы хотите <textbox> вместо <input type='text'>), вы можете легко использовать атрибут [UIHint()], чтобы указать, какой шаблон использовать. - person solidau; 07.04.2015
comment
Что ж, не лучше ли использовать [UIHint()] в случаях, когда вам нужен собственный шаблон? Я понимаю вашу точку зрения, но не могу придумать ни одного реального сценария, в котором нужен шаблон по умолчанию для типа String. - person ataravati; 07.04.2015
comment
например, как в этом примере, человек сможет включить оболочку <div class="editor-field"> внутри шаблона редактора строк, а не набирать / копировать и вставлять оболочку для каждого поля. - person solidau; 07.04.2015
comment
Конечно, в этом есть смысл. - person ataravati; 08.04.2015
comment
Мне непонятна аргументация о том, что строка типа слишком общая для шаблонов. Для меня это выглядит большим преимуществом, когда мне не нужно заботиться о различии между EditorFor и TextBoxFor и мне не нужно везде копировать элементы управления формой. Не могли бы вы объяснить, может быть? - person Diego Frehner; 10.02.2021
comment
@DiegoFrehner Если вы хотите использовать EditorTemplate для добавления класса, вы абсолютно правы. Я удалил это из своего ответа. - person ataravati; 15.02.2021