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

1

Когда я использую помощник 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, чтобы включить эти свойства и установить их значения динамически? так как он должен использоваться для различных свойств в моем классе?

  • 1
    Вам не нужен EditorTemplate для такой простой вещи. Почему бы вам просто не присвоить класс Html.TextBoxFor?
Теги:
asp.net-mvc-4
mvc-editor-templates

2 ответа

3
Лучший ответ

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

@model string

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

Удалите заполнитель, если вы этого не хотите.

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

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

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

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

  • 1
    Вау, это здорово! Поскольку я новичок в mvc, это действительно полезный кусок кода, которым вы поделились здесь. Только один вопрос, на какой заполнитель вы ссылаетесь, где в разметке он отображается?
0

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

@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })

Кстати, не рекомендуется создавать EditorTemplate для типа String. Тип String является слишком общим. Вы можете использовать разные EditorTemplates для разных полей с типом String.

  • 1
    Это правильный ответ, однако я не согласен с вашим анализом того, почему не стоит создавать шаблон редактора для типа String. Я не вижу ничего плохого в том, чтобы иметь шаблон по умолчанию для собственного редактора строк. Если вам понадобится несколько шаблонов редактора для типа String позже (например, вам нужно <textbox> вместо <input type='text'> ), тогда вы можете легко использовать [UIHint()] чтобы указать, какой Шаблон для использования.
  • 0
    Ну, не лучше ли использовать [UIHint()] в тех случаях, когда вам нужен собственный шаблон? Я понимаю вашу точку зрения, но я не могу вспомнить ни одного реального сценария, в котором необходим шаблон по умолчанию для типа String.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню