Этот вопрос связан с этим один, но я думаю, что в моем примере есть детали, которые могут изменить ответы.
Скажем, у меня есть действие пользователя на контроллере, которое отображает представление для отображения данных о конкретном пользователе, оно может иметь 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
.