ASP.NET MVC - Passage d'un modèle référençant un ensemble différent d'un contrôleur à une vue à l'aide de C #

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

  •  06-07-2019
  •  | 
  •  

Question

Étant donné deux assemblys:

  

project.web
  project.lib

L'assembly project.web fait référence à project.lib qui contient une logique métier. Une classe simple de project.lib:

public class Person
{
    public string Name;
}

Dans project.web.Controllers:

Using project.lib.models;

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

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

C'est la partie où j'ai quelques questions. Dans de nombreux exemples de projets, les éléments suivants ont été visualisés dans la vue (dans ce cas, Index.aspx):

<% @Import Namespace="project.lib.models" %>

Vous permettant d'utiliser l'objet Modèle comme suit:

<%= Model.Name %>

Je n'ai pas réussi à faire comme les exemples, j'ai dû le faire:

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

ou

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

Pourquoi est-ce ainsi? Quelle est la raison de cette similitude? Commentaires? Suggestions? La définition de ma classe ressemble à ceci:

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;
    }
}
Était-ce utile?

La solution

Votre vue peut ne pas être fortement typée. Essayez ce qui suit:

  1. Copiez le balisage de la vue
  2. Supprimer la vue
  3. Accédez à l'action du contrôleur qui pilote la vue
  4. Cliquez avec le bouton droit de la souris dans cette méthode, sélectionnez l'option Ajouter une vue.
  5. Assurez-vous qu'il s'agit d'une vue fortement typée et que vous identifiez correctement le type de votre modèle souhaité.
  6. Collez votre balise View dans la vue nouvellement créée.

Cela devrait fonctionner. Il ne semble pas qu'il vous manque un assemblage, car vous êtes en mesure de lancer le modèle correctement.

Il convient de noter que vous pouvez effectuer les opérations ci-dessus sans avoir à supprimer / restaurer une vue. Chaque vue a pour première ligne une déclaration semblable à la suivante:

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

La section importante à comprendre est l'attribut Inherits, ce qui implique que cette vue étend la classe MVC ViewPage<DomainModel.Person>. La propriété Model sera de type DomainModel.Person lors de l'exécution.

De plus, des problèmes liés aux versions précédentes d'ASP.NET MVC empêchent efficacement le fonctionnement correct des vues fortement typées. Voir Problème d'utilisation de Add Boîte de dialogue Afficher dans ASP.NET MVC RC1 pour une vue fortement typée pour plus de détails.

MODIFIER : après un petit travail de détective de la part de tous ceux qui ont posté ici, il semble que Visual Studio fasse référence à des versions plus anciennes de l'assembly contenant la classe Person. Fermer l'environnement de développement, effacer tous les dossiers obj / bin et redémarrer semble avoir résolu ce problème.

Autres conseils

Pourriez-vous s'il vous plaît publier votre <% @ page% > directif? Cela devrait être quelque chose comme:

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

Avez-vous essayé de créer un fichier code-behind fortement typé pour cette vue?

Vous devez mettre à jour la propriété inherits de la vue pour qu'il s'agisse du fichier code-behind:

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

puis dans le code-behind:

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

Je ne pense pas que la résolution de la classe System.Web.Mvc.ViewPage pose un problème, car la page ne se chargerait pas (vous obtiendrez une exception le long des lignes que System.Web.Mvc.ViewPage ne peut pas être. trouvé) et vous ne pourrez même pas accéder à la propriété Model.

Mise à jour 1: Notez que vous pouvez être pratiquement certain qu'il ne s'agit pas d'un problème de chargement / obtention des types System.Web.Mvc.ViewPage ou project.lib.models.Person . Comme vous l'avez mentionné dans votre question, cela fonctionne lorsque vous utilisez:

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

L'utilisation de System.Web.Mvc.ViewPage<project.lib.models.Person> sur la directive de page et <%= Model.Name %> doit fonctionner. Quelques choses supplémentaires que je voudrais essayer si cela ne fonctionne pas:

  • Supprimez la directive d'importation en le faisant.
  • Vérifiez si cet espace de noms a été ajouté à web.config.

Même si aucun des 2 ci-dessus ne devrait causer de problèmes, si vous ne le faites pas fonctionner avec ce qui a été mentionné précédemment, ce serait un scénario très étrange. Notez également que si vous avez ajouté des espaces de noms couramment utilisés dans le fichier web.config, vous pouvez utiliser ViewPage<Person> dans la directive de page.

Le nom de modèle auquel vous faites référence ne concerne pas l'importation de l'espace de nom, mais le type que vous avez défini dans la directive page.

La classe ViewPage a la propriété T Model, raison pour laquelle vous avez accès à la propriété Name (vous utilisez le type que vous avez spécifié).

pour que votre vue soit fortement typée dans votre objet modèle dans votre cas, la classe Person

tout ce dont vous avez besoin pour que cela fonctionne consiste à ajouter du code de référence au projet.lib et à mettre à jour la page dérictive:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top