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

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

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

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

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

Это будет отображать <input type="text">.Круто.

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

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

Например:

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

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

Предложения/ совет будет с благодарностью.

1 Ответ

2 голосов
/ 05 апреля 2011

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

  @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 } )
...