MVC Editor для привязки к типу в массиве - PullRequest
2 голосов
/ 25 ноября 2011

У меня есть ViewModel, которая, помимо других свойств, содержит массив объектов EmailAddress. У самого EmailAddress есть такие свойства, как «Адрес» и «IsPrimary». Моя модель разбивки:

public class UserDetailsViewModel {
  public BUser User { get; set; }
  public string[] Roles { get; set; }
  public EmailAddress[] EmailAddresses { get; set; }
}

Я показываю страницу "Сведения о пользователе", которая является довольно стандартной. Например, я отображаю данные, используя @Html.DisplayFor(model => model.User.UserName) и @Html.DisplayFor(model => model.User.Comment). У меня также есть раздел на странице, в котором перечислены все объекты EmailAddress, связанные с пользователем:

@if(Model.EmailAddresses.Length > 0) {
  foreach (var address in Model.EmailAddresses) {
    <div>
      @Html.DisplayFor(model => address.Address)
    </div>
  }
} else {
  <div class="center">User does not have any email addresses.</div>
}

Моя проблема в том, что я хотел бы показать форму «Добавить адрес электронной почты» над списком адресов электронной почты. Я думал, что приму «нормальный» подход таким образом:

@using(Html.BeginForm(new { id=Model.User.UserName, action="AddUserEmailAddress" })) {    
  <text>Address:</text> @Html.EditorFor(model => ** HERE I AM STUCK **)
  <input type="submit" value="Add Email" class="button" />
}

Как вы можете сказать, я застрял здесь. Я пробовал model => Model.EmailAddresses[0] и model => Model.EmailAddresses.FirstOrDefault(). Оба они ужасно потерпели неудачу.

Я уверен, что я все делаю неправильно. Я даже думал о добавлении «фиктивного» свойства в мою ViewModel типа EmailAddress, чтобы я мог связать его с этим в моем EditorFor - но это, похоже, очень плохой взлом. Там должно быть что-то простое, что я упускаю из виду!

Буду признателен за любую помощь, которую кто-либо может предложить по этому вопросу. Заранее спасибо!

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Я довольно новичок в MVC, но я уже решил эту проблему, для этого я использую @Html.Partial.

@Html.Partial("path/to/EditorTemplate", new EmailAddress())

Я также пытался выбрать маршрут EmailAddresses[0], я помню тот день с любовью. Я также не уверен, что это лучший способ, но он прекрасно сочетается с моим другим кодом.

1 голос
/ 25 ноября 2011

Вы можете использовать быстрый и грязный способ использования:

@Html.TextBox("NewEmail")

В вашем методе контроллера AddUserEmailAddress вы сможете получить опубликованное значение, используя:

Request.Form.GetValues("NewEmail")

или

Request["NewEmail"]

Если вы не хотите терять встроенную проверку, как вы заявили, вы всегда можете создать другое свойство в своей модели представления? Предоставьте вашему представлению форму или загрузите ее динамически с помощью jQuery.load ("/ Controller / AddEmail / UserID"). Добавить

public string NewEmail { get; set; } 

в вашей ViewModel, а ниже в вашем представлении

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

Кроме того, вы можете рассмотреть возможность использования строго типизированной структуры для ваших электронных писем, таких как List, которая дает вам больший контроль над вашими данными в определенных ситуациях.

...