Tenho 2 modelos:
public class Person
{
public int PersonID { get; set; }
public string PersonName { get; set; }
}
public class Order
{
public int OrderID { get; set; }
public int TotalSum { get; set; }
}
Quero editar objetos de AMBAS as classes na visualização SINGLE, então preciso de algo como:
@model _try2models.Models.Person
@model _try2models.Models.Order
@using(Html.BeginForm())
{
@Html.EditorFor(x => x.PersonID)
@Html.EditorFor(x => x.PersonName)
@Html.EditorFor(x=>x.OrderID)
@Html.EditorFor(x => x.TotalSum)
}
Isso, é claro, não funciona: apenas uma instrução 'model' é permitida em um arquivo .cshtml. Pode haver alguma solução alternativa?
asp.net-mvc-3
viewmodel
Smarty
fonte
fonte
ViewBag
com for each in view funcionou para mim, verifique isso para saber várias opções, economizei pouco tempo para mim em vez de criar um modelo de visualização ou visualização parcialRespostas:
Crie um modelo de vista pai que contenha os dois modelos.
Desta forma, você pode adicionar modelos adicionais em uma data posterior com o mínimo de esforço.
fonte
Para usar a tupla, você precisa fazer o seguinte; na visualização, altere o modelo para:
para usar métodos @html, você precisa fazer o seguinte, ou seja:
ou
Item1 indica o primeiro parâmetro passado para o método Tupla e você pode usar o Item2 para acessar o segundo modelo e assim por diante.
em seu controlador, você precisa criar uma variável do tipo Tupla e, em seguida, passá-la para a visualização:
Outro exemplo: vários modelos em uma vista
fonte
Tuple
neste caso - OP está querendo editar dados e umTuple
não tem construtor padrão, então o modelo não pode ser vinculado quando o formulário é enviadoOutra opção que não precisa criar um modelo customizado é usar uma Tupla <> .
Não é tão limpo quanto criar uma nova classe que contenha ambos, conforme a resposta de Andi, mas é viável.
fonte
@model
linhas separadas ?@Model.Item1.Property
e@Model.Item2.Property
paraPerson
eOrder
respectivamenteSe você é fã de modelos muito planos, apenas para apoiar a visualização, você deve criar um modelo específico para esta visualização em particular ...
Muitas pessoas usam o AutoMapper para mapear de seus objetos de domínio para suas visualizações planas.
A ideia do modelo de visualização é que ele apenas suporta a visualização - nada mais. Você tem um por visualização para garantir que ela contenha apenas o que é necessário para aquela visualização - não um monte de propriedades que você deseja para outras visualizações.
fonte
ok, todo mundo está fazendo sentido e eu peguei todas as peças e coloquei aqui para ajudar novatos como eu que precisam de explicação do começo ao fim.
Você faz sua grande classe com 2 classes, de acordo com a resposta de @Andrew.
Então em seu controlador você preenche os 2 modelos. Às vezes, você só precisa preencher um. Então, no retorno, você referencia o modelo grande e ele levará o 2 de dentro para a View.
No topo da visualização
Em seguida, carregue suas entradas ou exibições que fazem referência aos grandes conteúdos dos Modelos:
E. . . .de volta ao rancho, quando o Post chegar, faça referência à Grande Classe:
e fazer uso do (s) modelo (s) retornado (s):
Provavelmente tem algum material de Validação de DataAnnotation na classe e provavelmente coloque if (ModelState.IsValid) no topo do bloco de salvar / editar. . .
fonte
Na verdade, existe uma maneira de usar dois ou mais modelos em uma visualização sem envolvê-los em uma classe que contenha ambos.
Usando Employee como um modelo de exemplo:
É realmente tratado como.
Portanto, o método View (funcionário) está configurando seu modelo para o ViewBag e, em seguida, o ViewEngine o está projetando.
Isso significa que,
Pode ser usado como,
Essencialmente, você pode usar o que quer que esteja em seu ViewBag como um "Modelo" porque é assim que funciona de qualquer maneira. Não estou dizendo que isso seja arquitetonicamente ideal, mas é possível.
fonte
Basta criar um único modelo de visão com todas as informações necessárias nele, normalmente o que eu faço é criar um modelo para cada visão para que eu possa ser específico em cada visão, ou fazer um modelo pai e herdá-lo. OU faça um modelo que inclua ambas as vistas.
Pessoalmente, eu apenas os adicionaria em um modelo, mas é assim que eu faço:
fonte
Você pode usar o padrão de apresentação http://martinfowler.com/eaaDev/PresentationModel.html
Este modelo de "Visualização" de apresentação pode conter Person e Order, esta nova
classe pode ser o modelo de referência de sua visualização.
fonte
Outra maneira que nunca falamos é criar uma visão em MSSQL com todos os dados que você deseja apresentar. Em seguida, use LINQ to SQL ou qualquer outro para mapeá-lo. Em seu controlador, retorne-o à visualização. Feito.
fonte
você não pode declarar dois modelos em uma vista, tente usar
Html.Action("Person", "[YourController]")
&Html.Action("Order", "[YourController]")
.Boa sorte.
fonte
Ao lado de um modelo de visualização em asp.net, você também pode fazer múltiplas visualizações parciais e atribuir diferentes visualizações de modelo a cada visualização, por exemplo:
em seguida, outro modelo de vista parcial para o modelo de pedido
então, em sua visualização principal, carregue ambas as visualizações parciais por
fonte
Espero que você ache útil !!
eu uso o ViewBag para projeto e modelo para a tarefa, então, desta forma, estou usando dois modelos em visualização única e no controlador eu defini o valor ou dados do viewbag
e tendo em vista tbltask e projectlist são meus dois modelos diff
@ {
} @model List
fonte