Должны ли модели представления всегда содержать входные данные для форм в этом представлении?
Этот вопрос связан с этим, но я думаю, что в моем примере у меня есть детали, которые могут изменить ответы.
Скажем, у меня есть действие пользователя на контроллере, который отображает представление для отображения данных о конкретном пользователе, оно может иметь UserViewModel
вот так:
public class UserViewModel {
public string FirstName;
public string LastName;
etc...
}
Однако в этом представлении, а также при отображении этих пользовательских данных, я хочу иметь текстовое поле поиска для пользователя, чтобы они могли искать другого пользователя на этой странице. Эта форма будет размещена в действии FindUser, которое принимает следующую модель:
public class FindUserInputViewModel {
[Required]
public string SearchQuery;
}
Если это действие обнаруживает, что модель недействительна, оно перенаправляется обратно к действию User, сохраняя ModelState.
Теперь, чтобы показать ошибку проверки, я не могу использовать хелпер со строгой типизацией, так как это свойство поискового запроса не находится в UserViewModel
Я должен был бы сделать это:
@Html.TextBox("SearchQuery")
@Html.ValidationMessageFor("SearchQuery")
Это работает, и будет отображаться ошибка, а также показывается старое значение, которое было POSTed (как оно сохраняется в ModelState). Тем не менее, я бы предпочел использовать строго типизированный помощник везде, где это возможно.
Из всех примеров, которые я видел, картина здесь выглядит так: UserViewModel
должен содержать внутри него FindUserInputViewModel, возможно, как FindUserInput
имущество. Я мог бы тогда сделать:
@Html.TextBoxFor(m => m.FindUserInput.SearchQuery)
Это также работает, пока я удостоверяюсь, что мое действие FindUser привязано к правильному префиксу, или я указываю имя в вызове метода TextboxFor.
Однако я не совсем понимаю, почему мой UserViewModel должен содержать эту другую ViewModel просто для случая привязки валидации с использованием этого помощника. Это приносит другие преимущества, которых я не вижу? Я понимаю, как его использовать, если вашей модели View необходимо отобразить те же данные, которые вы публикуете, например, для типичного действия Edit, но здесь это не так.
Мне кажется, что здесь будет полезен еще один универсальный помощник, который может ссылаться на другой тип, что-то вроде этого:
@Html.TextBoxForType<FindUserInput>(m => m.SearchQuery)
Этого не существует, но я думаю, что я должен быть в состоянии написать это, и это хороший случай для одного. Это похоже на подходящее решение, или я что-то здесь упускаю?
Другой вариант, возможно, заключается в том, что маленькая форма для публикации в этом FindUserInputViewModel
должно иметь свое собственное действие GET, а также POST, а затем представление пользователя может просто вызвать его, используя @Html.Action
, Затем он может визуализировать частичное представление, которое строго типизировано FindUserInputViewModel
,
1 ответ
Почему бы не создать частичное представление для вашего поиска и просто передать это новое FindUserInputViewModel
с вашей точки зрения пользователя?
@Html.Partial("FindUser", new FindUserInputViewModel())
Вы можете ввести свой частичный вид на FindUserInputViewModel
и использовать строго типизированных помощников там. Я бы сказал, что это самый простой и изящный подход, разве что-то мне не хватает?