Html.EditorFor метод для атрибутов интерфейса - PullRequest
1 голос
/ 29 декабря 2011

Я начинающий веб-разработчик ASP.NET MVC 3, и у меня возникла эта проблема:

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

Шаблон называется "ExistOrCreateNewInput.cshtml" и строго типизирован с IExistOrCreateNewInput класс интерфейса:

public interface IExistOrCreateNewInput
{
  int? existEntId { get; set; }
  IUnapprovedNewEntityCreateInput createInput { get; set; }
}

Содержимое шаблона выглядит примерно так:

@model IExistOrCreateNewInput

<h2>Add or choose</h2>
@* here put some common js code *@
Html.EditorFor(o => o.existEntId)
Html.EditorFor(o => o.createInput)

Предположим, у меня есть какие-то модели, которые реализуют этот интерфейс, например:

public class FirstModelInput : IExistOrCreateNewInput
{
  [Display(Name="First")]
  [UIHint("Lookup")]
  public int? existEntId {get; set;}

  [UIHint("PaperCreateInput")]
  public PaperCreateInput paperCreateInput {get; set;}

  public IUnapprovedNewEntityCreateInput createInput
  {
      get
      {
          return paperCreateInput;
      }
      set { }
  }
}

public class SecondModelInput : IExistOrCreateNewInput
{
  [Display(Name="Second")]
  [UIHint("Lookup")]
  public int? existEntId {get; set;}

  [UIHint("ThesisCreateInput")]
  public ThesisCreateInput thesisCreateInput {get; set;}

  public IUnapprovedNewEntityCreateInput createInput
  {
      get
      {
          return thesisCreateInput;
      }
      set { }
  }
}
public class ThirdModelInput : IExistOrCreateNewInput
{
  ...
}

Где классы PaperCreateInput и ThesisCreateInput реализуют интерфейс IUnapprovedNewEntityCreateInput. Итак, я хочу, чтобы мой вид модели

public class SomeGlobalViewModel
{
  [Required]
  string name {get; set;}
  [UIHint("ExistOrCreateNewInput")]
  FirstModelInput firstModel {get; set;}
}

для правильной визуализации атрибута "firstModel" методом Html.EditorFor(o => o.firstModel). Теперь я знаю, что метод EditorFor работает с метаданными, поэтому, вероятно, мой вопрос должен выглядеть так: « как передать метаданные атрибутов в атрибуты базового интерфейса ». Поправь меня, если я ошибаюсь.
В любом случае, мне нужны эти вспомогательные методы

Html.EditorFor(o => o.existEntId)
Html.EditorFor(o => o.createInput)

в шаблоне моего редактора (строго типизированный с интерфейсом) для отображения атрибутов моих Моделей, как я их объявил в реализующих классах:

[UIHint("Lookup")]
public int? existEntId {get; set;}  
[UIHint("PaperCreateInput")]
public PaperCreateInput createInput {get; set;}

Заранее спасибо. Извините за мой плохой английский.

...