ASP.NET MVC - Passing ein Modell, eine andere Anordnung von einem Controller zu einer Ansicht mit C # Referenzierung

StackOverflow https://stackoverflow.com/questions/1415931

  •  06-07-2019
  •  | 
  •  

Frage

Bei zwei Baugruppen:

  

project.web
  project.lib

Die project.web Montage Referenzen project.lib die einige Geschäftslogik enthält. Eine einfache Klasse von project.lib:

public class Person
{
    public string Name;
}

In project.web.Controllers:

Using project.lib.models;

public class PersonController : Controller
{
    Person person = new Person();

    public ActionResult Index()
    {
        return View(person);
    }
}

Dies ist der Teil, wo ich einige Fragen haben.

: In vielen Beispielprojekte die folgenden in der Ansicht (in diesem Fall Index.aspx) gesehen habe ich
<% @Import Namespace="project.lib.models" %>

So dass Sie das Modell Objekt wie folgt verwenden:

<%= Model.Name %>

Ich habe das nicht bekommen, wie die Beispiele zu arbeiten, ich habe zu tun:

<%= (Model as Person).Name %>

oder

<%
    var person = (Person)Model;
    Response.Write(person.Name);
%>

Warum ist das so? Was ist der Grund für diese Soheit? Bemerkungen? Vorschläge? Meine Klassendefinition sieht wie folgt aus:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace project.lib.models
{
    public class Person
    {
        public Int64 PersonID;
        public string DisplayName;
        public string RealName;
    }
}
War es hilfreich?

Lösung

Ihre Ansicht nicht stark typisiert werden. Versuchen Sie wie folgt vor:

  1. Kopieren Sie die Ansicht Markup
  2. Löschen Sie die Ansicht
  3. Gehen Sie auf die Controller-Aktion, die die Ansicht
  4. Laufwerke
  5. Recht innerhalb dieser Methode klicken, die Add-View-Option wählen.
  6. Stellen Sie sicher,
  7. , dass dies eine stark typisierte Ansicht und dass Sie richtig die Art der beabsichtigten Modell identifizieren.
  8. Fügen Sie Ihre Ansicht Markup in die neu erstellte Ansicht.

Das sollte funktionieren. Es sieht nicht so aus, wie Sie eine Baugruppe sind vermisst, weil Sie das Modell richtig zu werfen sind in der Lage.

Es ist zu beachten, dass Sie, ohne den Schmerz zu löschen / Wiederherstellung eine Ansicht, die oben tun können. Jede Ansicht hat eine Erklärung als seine erste Zeile, die der folgenden ähnelt:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<DomainModel.Person>" %>

Der wichtige Abschnitt zu verstehen, ist das Inherits-Attribut, das bedeutet, dass diese Ansicht die MVC ViewPage<DomainModel.Person>-Klasse erweitert. Das Modell Eigenschaft wird zur Laufzeit vom Typ DomainModel.Person sein.

Auch gibt es Probleme mit früheren Versionen von ASP.NET MVC, die effektiv von der Arbeit richtig stark typisierte Ansichten verhindern. Siehe Problem mit Add Dialogfeld Ansicht in ASP.NET MVC RC1 für stark typisierte Ansicht für mehr Details.

Bearbeiten : Nach einem bisschen Detektivarbeit von allen, die hier gepostet hat, sieht es aus wie Visual Studio ältere Versionen der Montage Referenzierung wurde die Klasse Person enthält. Das Schließen der Entwicklungsumgebung nach unten, Entrümpelung alle obj / bin Ordner und Neustarten scheint dieses Problem behoben zu haben.

Andere Tipps

Könnten Sie bitte posten Sie Ihre <% @ Page%> Richtlinie? Es sollte so etwas sein:

<%@ Page Language="C#"
         [...]
         Inherits="System.Web.Mvc.ViewPage<project.lib.models.Person>" %>

Haben Sie versucht stattdessen eine stark typisierte Code-Behind-Datei für diese Ansicht zu erstellen?

Sie müssen die inherits Eigenschaft der Ansicht zu aktualisieren, die Code-Behind-Datei sein:

<%@ Page Language="C#" 
    CodeBehind="Index.aspx.cs" Inherits="project.web.Views.People.Index" %>

und dann in dem Code-behind:

namespace project.web.Views.People.Index {
  public partial class Index : System.Web.Mvc.ViewPage<project.lib.models.Person>
  {}
}

Ich glaube nicht, es ein Problem ist die System.Web.Mvc.ViewPage Klasse mit der Lösung als wäre die Seite nicht geladen werden (Sie würden eine Ausnahme entlang der Linien erhalten, die System.Web.Mvc.ViewPage nicht sein kann gefunden), und Sie würden das Modell Eigentum nicht einmal in der Lage sein, zugreifen zu können.

Update 1: Beachten Sie, dass Sie ziemlich sicher sein kann, dass es kein Problem Laden ist / immer auf die Typen System.Web.Mvc.ViewPage oder project.lib.models.Person . Wie Sie in Ihrer Frage erwähnt, es funktioniert, wenn Sie verwenden:

<% @Import Namespace="project.lib.models" %>
...
<%= (Model as Person).Name %>

Mit System.Web.Mvc.ViewPage<project.lib.models.Person> auf der Seite Richtlinie und <%= Model.Name %> arbeiten müssen. Einige zusätzliche Dinge, die ich versuchen würde, wenn das nicht funktioniert:

  • Entfernen Sie die Import-Direktive, wenn dies zu tun.
  • Überprüfen Sie, ob Sie haben, dass Namespace auf dem web.config hinzugefügt.

Während keiner der oben 2 sollte keine Probleme verursachen, wenn Sie es nicht bekommen, mit zu arbeiten, was vorher erwähnt wird, wäre es ein sehr seltsames Szenario sein. Beachten Sie auch, dass, wenn Sie häufig verwendete Namespaces in der web.config hinzufügen, haben Sie ViewPage<Person> auf der Seite Richtlinie verwenden können.


Die Model.Name Sie beziehen sich auf nicht mit dem Import der Namespace zu tun haben, Sie bekommen es von der Art Sie auf der Seite Richtlinie festgelegt.

Der View Klasse hat die Eigenschaft T Modell, weshalb Sie den Zugriff auf die Eigenschaft Name erhalten wird (Sie mit der Art arbeiten Sie angegeben).

zu tun, dass Ihre Ansicht sollte stark in Ihrem Fall der Person-Klasse zu Ihrem Modell-Objekt eingegeben wird

alles, was Sie brauchen, um es Arbeit refrence zum project.lib ist das Hinzufügen und das Hinzufügen der Seite derictive Aktualisierung:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top