Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Атрибуты данных ASP.NET MVC 3 - программная установка UIHint из контроллера

Автор вопроса: RPM1984Ответов: 1

Если у меня есть такая ViewModel:

public class SignupViewModel
{
   [Required]
   [DisplayName("Email:")]
   public string EmailAddress { get; set; }
}

И используйте EditorFor для отображения полей формы:

@Html.EditorFor(model => model.EmailAddress )

Он будет отображать <input type="text">. Прохладно.

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

Я знаю, что могу использовать [UIHint], но могу ли я сделать это программно с контроллера?

E.g:

var model = new SignupViewModel();
model.EmailAddress = GetFromMysterySource(); // How do i set a UIHint?

Как лучше всего подойти к этому? Должен ли я вообще использовать отдельную ViewModel, что может означать изменение моего представления со строго типизированного на dynamic, или я не должен использовать EditorFor, или я должен использовать собственный шаблон редактора?

Предложения/советы будут весьма признательны.

razordata-annotationsmodelmetadataeditortemplates

Ответы

Ответ 1 · рейтинг 2 · tvanfosson

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

  @if (Model.EmailAddressIsFixed)
  {
     @Html.DisplayFor( m => m.EmailAddress )
     @Html.HiddenFor( m => m.EmailAddress ) // only if you need it to post back
  }
  else
  {
     @Html.EditorFor( m => m.EmailAddress )
  }

Если вы делаете это более чем в одном месте, то, вероятно, вам подойдет специальный шаблон редактора, делающий то же самое.

  @Html.EditorFor( m => m.EmailAddress,
                   "FixedAddressTemplate",
                   new { Fixed = Model.EmailAddressIsFixed } )

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы