Когда я использую помощник 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, чтобы включить эти свойства и установить их значения динамически? так как он должен использоваться для различных свойств в моем классе?
Вы можете использовать это:
@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 со значениями, взятыми из этих аннотаций, в порядке, указанном в шаблоне редактора (подсказка (водяной знак), имя, а затем имя свойства).
Вместо использования EditorTemplate для String просто используйте TextBoxFor так:
@Html.TextBoxFor(model => model.UserName, new { @class = "form-control" })
Кстати, не рекомендуется создавать EditorTemplate для типа String. Тип String является слишком общим. Вы можете использовать разные EditorTemplates для разных полей с типом String.
<textbox>
вместо <input type='text'>
), тогда вы можете легко использовать [UIHint()]
чтобы указать, какой Шаблон для использования.
[UIHint()]
в тех случаях, когда вам нужен собственный шаблон? Я понимаю вашу точку зрения, но я не могу вспомнить ни одного реального сценария, в котором необходим шаблон по умолчанию для типа String.