Должны ли модели представления всегда содержать входные данные для форм в этом представлении?

Этот вопрос связан с этим один, но я думаю, что в моем примере есть детали, которые могут изменить ответы.

Скажем, у меня есть действие пользователя на контроллере, которое отображает представление для отображения данных о конкретном пользователе, оно может иметь UserViewModel вот так:

public class UserViewModel {
    public string FirstName;
    public string LastName;
    etc...
}

Однако в этом представлении, помимо отображения этих пользовательских данных, я хочу иметь текстовое поле поиска для пользователя, чтобы он мог искать другого пользователя на этой странице. Эта форма будет публиковаться в действии FindUser, которое принимает следующую модель:

public class FindUserInputViewModel {
   [Required]
   public string SearchQuery;
}

Если это действие обнаруживает, что модель недействительна, оно перенаправляет обратно к действию пользователя, сохраняя ModelState.

Теперь, в настоящее время, чтобы показать ошибку проверки, я не могу использовать строго типизированный помощник, поскольку этого свойства поискового запроса нет в UserViewModel, мне пришлось бы сделать это:

@Html.TextBox("SearchQuery")
@Html.ValidationMessageFor("SearchQuery")

Это работает, и будет отображаться ошибка, а также показано старое значение, которое было отправлено POST (поскольку оно сохраняется в ModelState). Однако я бы предпочел использовать строго типизированный помощник везде, где это возможно.

Из всех примеров, которые я видел, шаблон здесь, кажется, таков, что UserViewModel должен содержать внутри себя FindUserInputViewModel, возможно, как свойство FindUserInput. Затем я мог бы сделать:

@Html.TextBoxFor(m => m.FindUserInput.SearchQuery)

Это также работает, пока я удостоверяюсь, что мое действие FindUser привязано к правильному префиксу, или я указываю имя в вызове метода TextboxFor.

Однако я действительно не понимаю, почему моя UserViewModel должна содержать эту другую ViewModel просто для случая привязки проверки с помощью этого помощника. Приносит ли это другие преимущества, которых я не вижу? Я понимаю его использование, если модели вашего представления необходимо отображать те же данные, которые вы публикуете, например, в типичном действии редактирования, но здесь это не так.

Мне кажется, что здесь был бы удобен еще один общий помощник, который может ссылаться на другой тип, что-то вроде этого:

@Html.TextBoxForType<FindUserInput>(m => m.SearchQuery)

Этого не существует, но я думаю, что должен быть в состоянии написать это, и это хороший случай для одного. Это похоже на подходящее решение, или я что-то здесь упускаю?

Другой вариант полностью заключается в том, что малая форма для публикации в этом FindUserInputViewModel должна иметь свое собственное действие GET, а также POST, а затем пользовательское представление может просто вызывать его с помощью @Html.Action. Затем он может отображать частичное представление, которое строго типизировано только до FindUserInputViewModel.


person Kasaku    schedule 28.11.2012    source источник


Ответы (1)


Почему бы не создать частичное представление для вашего поиска и просто передать это новое FindUserInputViewModel из вашего пользовательского представления?

@Html.Partial("FindUser", new FindUserInputViewModel())

Вы можете ввести свое частичное представление в FindUserInputViewModel и использовать там строго типизированные помощники. Я бы сказал, что это самый простой и аккуратный подход, если я что-то упускаю?

person Ant P    schedule 28.11.2012