Я хочу иметь 2 модели в одном представлении. Страница содержит как LoginViewModel
и RegisterViewModel
.
например
public class LoginViewModel
{
public string Email { get; set; }
public string Password { get; set; }
}
public class RegisterViewModel
{
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
}
Мне нужно сделать еще одну ViewModel, которая содержит эти 2 ViewModel?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
Мне нужно, чтобы атрибуты валидации были перенесены в представление. Вот почему мне нужны ViewModels.
Разве нет другого способа, такого как (без BigViewModel
):
@model ViewModel.RegisterViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Name)
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
@model ViewModel.LoginViewModel
@using (Html.BeginForm("Login", "Auth", FormMethod.Post))
{
@Html.TextBoxFor(model => model.Email)
@Html.PasswordFor(model => model.Password)
}
asp.net-mvc
asp.net-mvc-3
Шон Маклин
источник
источник
ViewBag
для каждого в представлении, отлично работает@
перед его именем, как я сделал здесь.Ответы:
Есть много способов ...
с вашей BigViewModel вы делаете:
Вы можете создать 2 дополнительных вида
Login.cshtml
и register.cshtml тоже самое
после создания вы должны отобразить их в главном представлении и передать их viewmodel / viewdata
так может быть так:
или
использование ajax-частей вашего сайта становится более независимым
iframes
, но, вероятно, это не тот случайисточник
@Html.RenderAction
об ошибке, что Expression должен возвращать значениеЯ бы порекомендовал использовать
Html.RenderAction
и PartialViewResults для достижения этой цели; это позволит вам отображать те же данные, но каждое частичное представление будет по-прежнему иметь одну модель представления и устраняет необходимостьBigViewModel
Таким образом, ваш взгляд содержит что-то вроде следующего:
Где
Login
&Register
оба действия в вашем контроллере определены следующим образом:Тогда
Login
&Register
будет пользовательским элементом управления, находящимся либо в текущей папке View, либо в папке Shared, и будет выглядеть примерно так:/Views/Shared/Login.cshtml: (или /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (или /Views/MyView/Register.cshtml)
И там у вас есть единственное действие контроллера, просмотр и просмотр файла для каждого действия, каждое из которых совершенно не зависит друг от друга.
источник
RenderAction
. Я всегда забываю его часть пакета фьючерсов, так как мой проект всегда включает эту DLL по умолчанию. Это действительно зависит от предпочтений и требований к применению, если дополнительные циклы mvc стоят того разделения, которое они дают на стороне проектирования. Часто вы можете кэшироватьRenderAction
результаты, поэтому единственный удар, который вы делаете, - это небольшая дополнительная обработка через фабрику контроллеров.Другой способ заключается в использовании:
Я объяснил, как использовать этот метод в представлении и контроллере для другого примера: две модели в одном представлении в ASP MVC 3
В вашем случае вы можете реализовать это, используя следующий код:
По мнению:
Обратите внимание, что я вручную изменил атрибуты имени для каждого свойства при построении формы. Это необходимо сделать, в противном случае он не будет должным образом сопоставлен с параметром метода модели типа при отправке значений в связанный метод для обработки. Я бы предложил использовать отдельные методы для обработки этих форм отдельно, в этом примере я использовал методы Login1 и Login2. Метод Login1 требует наличия параметра типа RegisterViewModel, а метод Login2 требует параметра типа LoginViewModel.
если требуется actionlink, вы можете использовать:
в методе контроллера для представления необходимо создать переменную типа Tuple и затем передать ее представлению.
Пример:
или вы можете заполнить два экземпляра LoginViewModel и RegisterViewModel значениями, а затем передать их в представление.
источник
EditorFor
илиHiddenFor
(что в идеале я хочу использовать), свойства модели не устанавливаются при вызове методовLogin1
/Login2
controller. Предположительно,@Name=
отображение игнорируется. Требуется лиHiddenFor
какой-то другой прием для этой ситуации?Используйте модель представления, которая содержит несколько моделей представления:
По вашему мнению:
источник
Ответ: Нет
Да , вы можете использовать Tuple (дает волшебный взгляд, имея несколько моделей).
Код:
источник
Добавьте этот ModelCollection.cs к вашим моделям
контроллер:
Вид:
источник
простой способ сделать это
мы можем сначала назвать всю модель
затем отправьте вашу модель с viewbag
и ввиду
затем легко использовать это как модель
источник
Мой совет - сделать модель с большим обзором:
В вашем Index.cshtml, если, например, у вас есть 2 партиала:
и в контроллере:
источник
Я хочу сказать, что мое решение было похоже на ответ, представленный на этой странице: в ASP.NET MVC 4 несколько моделей в одном представлении?
Однако в моем случае запрос linq, который они использовали в своем контроллере, не работал для меня.
Это сказал запрос:
Следовательно, «по вашему мнению, просто укажите, что вы используете коллекцию моделей представлений», у меня тоже не получилось.
Тем не менее, небольшое изменение этого решения сработало для меня. Вот мое решение на случай, если это кому-нибудь поможет.
Вот моя модель представления, в которой я знаю, что у меня будет только одна команда, но у этой команды может быть несколько досок (и у меня есть папка ViewModels в моей папке Models, кстати, отсюда и пространство имен):
Теперь это мой контроллер. Это наиболее существенное отличие от решения по ссылке, указанной выше. Я строю ViewModel для отправки в представление по-другому.
Тогда, на мой взгляд, я не указываю это как список. Я просто делаю "@model TaskBoard.Models.ViewModels.TeamBoards" Тогда мне нужно только для каждого, когда я перебираю доски Команды. Вот мой взгляд:
Я довольно новичок в ASP.NET MVC, поэтому мне потребовалось немного времени, чтобы понять это. Итак, я надеюсь, что этот пост поможет кому-то разобраться в своем проекте в более короткие сроки. :-)
источник
Вы всегда можете передать второй объект в ViewBag или View Data.
источник
Создайте один новый класс в вашей модели и свойства
LoginViewModel
иRegisterViewModel
:Тогда используйте
UserDefinedModel
по вашему мнению.источник
Это упрощенный пример с IEnumerable.
Я использовал две модели в представлении: форму с критериями поиска (модель SearchParams) и сетку для результатов, и я боролся с тем, как добавить модель IEnumerable и другую модель в то же представление. Вот что я придумал, надеюсь, это кому-нибудь поможет:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
источник