Eu quero ter 2 modelos em uma visão. A página contém ambos LoginViewModel
e RegisterViewModel
.
por exemplo
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; }
}
Preciso criar outro ViewModel que possua esses 2 ViewModels?
public BigViewModel
{
public LoginViewModel LoginViewModel{get; set;}
public RegisterViewModel RegisterViewModel {get; set;}
}
Eu preciso que os atributos de validação sejam antecipados para a exibição. É por isso que eu preciso dos ViewModels.
Não existe outra maneira como (sem o 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
Shawn Mclean
fonte
fonte
ViewBag
por cada um na vista, funciona muito bem@
na frente do nome dela , como fiz aqui.Respostas:
Há várias maneiras...
com seu BigViewModel você faz:
você pode criar 2 visualizações adicionais
Login.cshtml
e register.cshtml a mesma coisa
após a criação, você deve renderizá-los na visualização principal e transmitir a viewmodel / viewdata
então poderia ser assim:
ou
o uso de partes ajax do seu site se torna mais independente
iframes
, mas provavelmente este não é o casofonte
@Html.RenderAction
está relatando um erro que Expression deve retornar um valorEu recomendo usar
Html.RenderAction
e PartialViewResults para fazer isso; permitirá que você exiba os mesmos dados, mas cada vista parcial ainda teria um modelo de vista único e elimina a necessidade de umBigViewModel
Portanto, sua visualização contém algo como o seguinte:
Onde
Login
&Register
são as duas ações no seu controlador definidas da seguinte forma:Os
Login
&Register
seriam então controles de usuário que residem na pasta View atual ou na pasta Shared e gostaria algo como isto:/Views/Shared/Login.cshtml: (ou /Views/MyView/Login.cshtml)
/Views/Shared/Register.cshtml: (ou /Views/MyView/Register.cshtml)
E aí você tem uma única ação do controlador, visualiza e exibe o arquivo para cada ação, sendo que cada um é totalmente distinto e não depende um do outro para nada.
fonte
RenderAction
. Eu sempre esqueço sua parte do pacote de futuros, pois meu projeto sempre inclui essa dll por padrão. É realmente de acordo com os requisitos de preferência e aplicação, se os ciclos adicionais de mvc valem a separação que ele oferece no lado do design. Muitas vezes você pode armazenar em cache osRenderAction
resultados, portanto, a única ocorrência que você recebe é o pequeno processamento extra via fábrica do controlador.Outra maneira é usar:
Expliquei como usar esse método na exibição e no controlador para outro exemplo: Dois modelos em uma exibição no ASP MVC 3
No seu caso, você pode implementá-lo usando o seguinte código:
Na visualização:
Observe que eu alterei manualmente os atributos de nome para cada propriedade ao criar o formulário. Isso precisa ser feito, caso contrário, não seria mapeado corretamente para o parâmetro do tipo de modelo do método quando os valores forem enviados ao método associado para processamento. Eu sugeriria o uso de métodos separados para processar esses formulários separadamente; neste exemplo, usei os métodos Login1 e Login2. O método Login1 requer um parâmetro do tipo RegisterViewModel e Login2 requer um parâmetro do tipo LoginViewModel.
se um link de ação for necessário, você poderá usar:
no método do controlador para a exibição, uma variável do tipo Tupla precisa ser criada e depois passada para a exibição.
Exemplo:
ou você pode preencher as duas instâncias de LoginViewModel e RegisterViewModel com valores e depois passá-lo para a visualização.
fonte
EditorFor
ouHiddenFor
(o que é ideal o que eu quero usar) as propriedades do modelo não serão definidas quando os métodosLogin1
/Login2
controller forem chamados. Presumivelmente, o@Name=
mapeamento está sendo ignorado. Será queHiddenFor
exigem algum outro truque para esta situação?Use um modelo de vista que contenha vários modelos de vista:
Na sua opinião:
fonte
Resposta: Não
Sim , você pode usar Tupla (traz a mágica tendo em vista o modelo múltiplo).
Código:
fonte
Adicione este ModelCollection.cs aos seus modelos
Controlador:
A vista:
fonte
uma maneira simples de fazer isso
podemos chamar todos os modelos primeiro
então envie seu modelo com viewbag
e em vista
então use-o facilmente como o Model
fonte
Meu conselho é criar um modelo de visão ampla:
No seu Index.cshtml, se por exemplo você tiver 2 parciais:
e no controlador:
fonte
Quero dizer que minha solução foi a resposta fornecida nesta página de stackoverflow: ASP.NET MVC 4, vários modelos em uma exibição?
No entanto, no meu caso, a consulta linq que eles usaram em seu Controller não funcionou para mim.
Isto é dito consulta:
Consequentemente, "na sua opinião, apenas especifique que você está usando uma coleção de modelos de visualização" também não funcionou para mim.
No entanto, uma ligeira variação nessa solução funcionou para mim. Aqui está a minha solução, caso isso ajude alguém.
Aqui está o meu modelo de exibição no qual eu sei que terei apenas uma equipe, mas essa equipe pode ter várias placas (e eu tenho uma pasta ViewModels dentro da minha pasta Models btw, daí o namespace):
Agora este é o meu controlador. Essa é a diferença mais significativa da solução no link mencionado acima. Eu construo o ViewModel para enviar para o modo de exibição diferente.
Então, na minha opinião, não o especifico como uma lista. Eu apenas faço "@model TaskBoard.Models.ViewModels.TeamBoards" Então, só preciso de um para cada um quando iterar nos quadros da equipe. Aqui está a minha opinião:
Eu sou bastante novo no ASP.NET MVC, por isso demorei um pouco para descobrir isso. Espero que este post ajude alguém a descobrir o projeto em um prazo mais curto. :-)
fonte
você sempre pode passar o segundo objeto em um ViewBag ou em View Data.
fonte
Crie uma nova classe em seu modelo e propriedades de
LoginViewModel
eRegisterViewModel
:Então use
UserDefinedModel
na sua visão.fonte
Este é um exemplo simplificado com IEnumerable.
Eu estava usando dois modelos na exibição: um formulário com critérios de pesquisa (modelo SearchParams) e uma grade para resultados, e lutei com como adicionar o modelo IEnumerable e o outro modelo na mesma exibição. Aqui está o que eu vim com, espero que isso ajude alguém:
...)
SearchViewModel.cs:
DelegateController.cs:
SearchParamsViewModel.cs:
fonte