2012-08-04 4 views
0

Je voudrais utiliser deux fois @model pour obtenir des données d'une autre partie de mon site Web est-ce possible? Parce que maintenant j'ai une erreur mais si je n'ai que ce premier @model tout fonctionne correctement.MVC 3 en utilisant @model deux fois

Look ->MVC 3 - Exception Details: System.InvalidOperationException

Erreur 2 'SportsStore.Entities.Kategorie' ne contient pas de définition de 'Opis' et aucune méthode d'extension 'Opis' accepter un premier argument de type « SportsStore.Entities. Kategorie 'peut être trouvé (manque-t-il une directive using ou une référence d'assembly?) C: \ Utilisateurs \ Rafal \ Desktop \ MVC ksiązka \ moj projekt \ sklep \ SportsStore.WebUI \ Views \ Produit \ List.cshtml 16 4 SportsStore. WebUI

@model IEnumerable<SportsStore.Entities.Towar> 
@model IEnumerable<SportsStore.Entities.Kategorie> 


@{ 
    ViewBag.Title = "List"; 
} 

<h2>List</h2> 

@foreach (var p in Model) 
{ 
    <div class="item"> 
     <h3>@p.Nazwa</h3> 
     @p.Opis 
     <h4>@p.Cena.ToString("c")</h4> 
    </div> 
} 

Répondre

2

Vous ne pouvez h ave un modèle par vue. Mais vous pouvez utiliser un autre objet à declarate le modèle:

public class SomeViewModel 
{ 
    public IEnumerable<Towar> Towars; 
    public IEnumerable<Category> Categories; 

    public SomeViewModel(IEnumerable<Towar> towars, IEnumerable<Category> categories) { 
    Towars = towars; 
    Categories = categories; 
    } 
} 

Et puis l'utiliser dans votre vue comme ceci:

@model SportsStore.Entities.SomeViewModel 

@foreach (var item in Model.Towars) 
{ 
    <div class="item"> 
    <h3>@p.Nazwa</h3> 
    @p.Opis 
    <h4>@p.Cena.ToString("c")</h4> 
    </div> 
} 
@foreach (var item in Model.Categories) { 
    @item.Name @* or what you need down here *@ 
} 

Je recommande également d'utiliser des noms anglais dans MVC. Il est plus clair de lire et de comprendre;).

2

Je pense que ce serait un cas pour créer un ViewModel (pour combiner les deux entités que vous avez), puis baser une vue sur ce ViewModel.

1

Il est préférable de créer un modèle de vue pour représenter vos données. Votre modèle de vue doit uniquement contenir ce que vous devez afficher sur votre vue. Tout ce qui n'est pas utilisé, vous pouvez l'enlever, aucun point d'être là. Votre modèle de vue peut ressembler à ceci:

using SportsStore.Entities; 

public class YourViewModel 
{ 
    public IEnumerable<Towar> Towars { get; set; } 

    public IEnumerable<Kategorie> Categories { get; set; } // I assume this is categories 
} 

Disons que vous devez utiliser ce modèle de vue en créer vue, votre créer une action peut ressembler à ceci:

public class YourController : Controller 
{ 
    private readonly ITowarRepository towarRepository; 
    private readonly ICategoryRepository categoryRepository; 

    public YourController(ITowarRepository towarRepository, ICategoryRepository categoryRepository) 
    { 
      this.towarRepository = towarRepository; 
      this.categoryRepository = categoryRepository; 
    } 

    public ActionResult Create() 
    { 
      YourViewModel viewModel = new YourViewModel 
      { 
       Towars = towarRepository.GetAll(), 
       Categories = categoryRepository.GetAll() 
      }; 

      return View(viewModel); 
    } 
} 

Et puis dans votre Afficher:

@model YourProject.DomainModel.ViewModels.YourViewModel 

@foreach (var towar in Model.Towars) 
{ 
    // Do whatever 
} 

@foreach (var category in Model.Categories) 
{ 
    // Do whatever 
}