ASP.NET MVC - Passando um modelo fazendo referência a um conjunto diferente de um controlador para um modo de exibição usando C #

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

  •  06-07-2019
  •  | 
  •  

Pergunta

Dado dois conjuntos:

project.web
project.lib

A referências de assembly project.web project.lib que contém alguma lógica de negócios. A classe simples de project.lib:

public class Person
{
    public string Name;
}

Em project.web.Controllers:

Using project.lib.models;

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

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

Esta é a parte onde eu tenho algumas perguntas. Em uma série de projetos de exemplo que eu vi o seguinte na Vista (neste caso index.aspx):

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

permitindo que você use o modelo de objeto como este:

<%= Model.Name %>

Eu não tenham obtido que isso funcione como os exemplos, eu tive que fazer:

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

ou

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

Por que isso é assim? Qual é a razão para este thusness? Comentários? Sugestões? Minha definição de classe esta aparência:

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;
    }
}
Foi útil?

Solução

A sua visão não pode ser fortemente tipado. Tente o seguinte:

  1. Copie o Ver marcação
  2. Exclua o Ver
  3. Vá para a ação do controlador que impulsiona o Ver
  4. Botão direito do mouse dentro deste método, selecione a opção Add View.
  5. Certifique-se de que esta é uma visão fortemente tipado e que você identificar corretamente o tipo do seu modelo pretendido.
  6. Cole seu Ver marcação para a vista recém-criado.

Isso deve funcionar. Ele não se parece com você está perdendo uma assembleia porque você é capaz de lançar o modelo corretamente.

Note-se que você pode fazer o acima sem a dor da exclusão / restaurar a View. Cada ponto de vista tem uma declaração como sua primeira linha que é semelhante ao seguinte:

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

A seção importante a entender é o atributo Inherits, o que implica que esta visão se estende a classe ViewPage<DomainModel.Person> MVC. A propriedade Modelo será do tipo DomainModel.Person em tempo de execução.

Além disso, existem problemas com versões anteriores do ASP.NET MVC que efetivamente impedem vistas fortemente tipados de funcionar corretamente. Consulte Problema usando Add Ver caixa de diálogo na ASP.NET MVC RC1 para fortemente tipado vista para obter mais detalhes.

Editar : Depois de um pouco de trabalho de detetive por todos que postou aqui, parece que Visual Studio foi referência versões mais antigas do que contém o conjunto da classe Pessoa. Fechando o ambiente de desenvolvimento para baixo, limpando todos os obj / pastas bin, e reiniciando parece ter corrigido o problema.

Outras dicas

Você poderia por favor postar sua <% @ Page%> directiva? Deve ser algo como:

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

Você tentou criar um code-behind fortemente tipado arquivo para esta vista em vez disso?

Você precisa de atualizar a propriedade herda da vista a ser o code-behind file:

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

e, em seguida, no code-behind:

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

Eu não acho que é um problema com a resolução da classe System.Web.Mvc.ViewPage como então a página não iria carregar (que você deseja obter uma exceção ao longo das linhas que System.Web.Mvc.ViewPage não pode ser encontrado), e você não iria mesmo ser capaz de acessar a propriedade modelo.

Update 1: Note que você pode estar certo de que não é uma carga de emissão / ficando com os tipos System.Web.Mvc.ViewPage ou project.lib.models.Person . Como você mencionou na sua pergunta, ela não funciona quando você usa:

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

Usando System.Web.Mvc.ViewPage<project.lib.models.Person> sobre a directiva de página e <%= Model.Name %> deve trabalhar. Algumas coisas extras que eu iria tentar se isso não funciona:

  • Remova a diretiva de importação quando fazê-lo.
  • Verifique se você tem esse namespace adicionado no web.config.

Enquanto nenhum dos 2 acima deve causar nenhum problema, se você não obtê-lo para trabalhar com o que é mencionado antes disso, seria um cenário muito estranho. Observe também que se você se adicionar namespaces comumente utilizados no web.config você pode usar ViewPage<Person> sobre a directiva página.


O Model.Name que você se refere não tem a ver com a importação do namespace, você obtê-lo a partir do tipo de definir na directiva página.

A classe ViewPage tem a propriedade modelo T, que é por isso que você tenha acesso à propriedade de nome (você está trabalhando com o tipo especificado).

para fazer que a sua visão deve ser fortemente tipado para o seu modelo de objeto no seu caso a classe Person

tudo que você precisa para torná-lo trabalho está adicionando refrence ao project.lib e adicionando atualizar o derictive página:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top