2 Stimmen

Verwendung von zwei Modellen in einem Controller?

Ich habe derzeit eine Anwendung mit einer Startseite, auf der eine Liste von zehn Filmen basierend auf dem Datum, an dem sie "erstellt" oder in die Datenbank eingetragen wurden, angezeigt wird. Ich möchte auch eine Liste der zehn besten Filme basierend auf der Bewertung jedes Films anzeigen. Gibt es eine Möglichkeit, ein anderes Modell zu übergeben oder meinen aktuellen ViewModel zu ändern, um dies zu tun? Hier ist der Indexabschnitt meines HomeController:

    public ActionResult Index()
    {
        var model =
            _db.Movies
                .OrderByDescending(m => m.DateEntered)
                .Take(10)
                .Select(m => new MovieListViewModel 
                {
                    Id = m.Id,
                    Title = m.Title,
                    Genre = m.Genre,
                    ReleaseDate =  m.ReleaseDate,
                    CountOfReviews = m.Reviews.Count()
                });

        return View(model);

    }

Und das ViewModel, das übergeben wird:

public class MovieListViewModel
{
    public int Id { get; set; }
    public string Title { get; set; }
    public string Genre { get; set; }

    [Display(Name="Erscheinungsjahr")]
    public DateTime ReleaseDate { get; set; }
    public int CountOfReviews { get; set; }
}

7voto

Matt Houser Punkte 31064

Erstellen Sie ein Modell, das beide Listen umfasst:

public class MovieListViewModel
{
  public List Top10ByCreated { get; set; }
  public List Top10ByRating { get; set; }
}

public class MovieModel
{
  public int Id { get; set; }
  public string Title { get; set; }
  public string Genre { get; set; }

  [Display(Name="Veröffentlichungsjahr")]
  public DateTime ReleaseDate { get; set; }
  public int CountOfReviews { get; set; }
}

Dann in Ihrem Controller:

var model = new MovieListViewModel();

model.Top10ByCreated = ...
model.Top10ByRating = ...

return View(model);

In Ihrer Ansicht verwenden Sie MovieListViewModel als Ihr Modell und verwenden Sie Ihre beiden Listen nach Bedarf.

2voto

Pbirkoff Punkte 4582

Erstellen Sie einfach ein weiteres Viewmodel mit zwei Eigenschaften für die zwei Listen:

public class MovieIndexViewModel
{
    public IEnumerable TopTenByDate { get; set; }
    public IEnumerable TopTenByRating { get; set; }
}

Im Controller können Sie dieses Viewmodel erstellen und die beiden Listen übergeben:

public ActionResult Index()
    {
        var vm = new MovieIndexViewModel();

        vm.TopTenByDate = ....;
        vm.TomTenByRating = ...;

        return View(vm );

    }

1voto

Tim M. Punkte 52563

Sie können ein einzelnes ViewModel erstellen, das die beiden Resultsets enthält. Der Controller instanziiert dann den übergeordneten Typ und füllt die Kindersammlungen, wie Sie es für richtig halten.

public sealed class HomeViewModel{
    public MovieListViewModel TopTenByRating { get; set; }
    public MovieListViewModel TopTenByDate { get; set; }
}

public ActionResult Index()
{
    var model = new HomeViewModel();

    model.TopTenByDate =
        _db.Movies
            .OrderByDescending(m => m.DateEntered)
            .Take(10)
            .Select(m => new MovieListViewModel 
            {
                Id = m.Id,
                Title = m.Title,
                Genre = m.Genre,
                ReleaseDate =  m.ReleaseDate,
                CountOfReviews = m.Reviews.Count()
            });

    model.TopTenByRating = // etwas anderes

    return View(model);
}

Für komplexere Szenarien bevorzuge ich einen dedizierten Komponisten, der für die Einrichtung des ViewModels verantwortlich ist (anstatt die gesamte Logik in der Aktionsmethode zu haben).

Für ein einfaches Szenario wie dieses ist es am einfachsten, es im Controller einzurichten. Wenn Sie feststellen, dass Sie die Abfrage-Logik wiederverwenden müssen, erwägen Sie, sie in eine Hilfsklasse abstrahieren.

0voto

JTMon Punkte 3161

Ein anderer Ansatz wäre es, die Hauptansicht zu erstellen und sie so zu rendern, dass die Ergebnisse von 2 Aktionsmethoden zurückgegeben werden, die jeweils auf eines der Modelle typisiert sind.

0voto

Mairaj Ahmad Punkte 14088

Sie haben verschiedene Optionen, Sie können jede davon verwenden

Verwenden Sie ViewModel

Für das ViewModel müssen Sie eine Klasse erstellen, in dieser Klasse definieren Sie alle Modelle als Eigenschaften dieser Klasse. Hier sind zwei Klassen.

public class EmployeeDetails
{
    [Erforderlich]
    [Anzeige(Name = "Name")]
    public string Name { get; set; }

}

public class Employee
{
    public int Id { get; set; }
}

Hier ist das ViewModel

public class ViewModel
{
    public Employee emp { get; set; }
    public EmployeeDetails empdet{ get; set; }
}

Jetzt machen Sie es im Controller wie folgt

public ActionResult About()
{
        ViewModel vm = new ViewModel();
        vm.emp = new Employee();
        vm.empdet = new EmployeeDetails();
        return View(vm);
}

Und in der Ansicht erhalten Sie es so

@model ViewModel

Verwenden Sie Tuple

Tuple wird verwendet, um verschiedene Typen zu speichern. Sie können die Objekte Ihrer benötigten Klassen darin speichern und an die Ansicht übergeben.

Im Controller

Tuple tuple = new Tuple(1, "Hallo Welt");
return View(tuple);

In der Ansicht erhalten Sie es so

@model Tuple

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X