ASP.NET MVC – передача модели, ссылающейся на другую сборку, из контроллера в представление с помощью C#

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

  •  06-07-2019
  •  | 
  •  

Вопрос

Даны две сборки:

проект.веб
проект.lib

Сборка project.web ссылается на project.lib, который содержит некоторую бизнес-логику.Простой класс из project.lib:

public class Person
{
    public string Name;
}

В project.web.Controllers:

Using project.lib.models;

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

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

Это та часть, где у меня есть несколько вопросов.Во многих примерах проектов я видел в представлении следующее (в данном случае Index.aspx):

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

Разрешение вам использовать объект модели следующим образом:

<%= Model.Name %>

У меня не получилось, как в примерах, мне пришлось сделать:

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

или

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

Почему это так?В чем причина такой тактичности?Комментарии?Предложения?Определение моего класса выглядит следующим образом:

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;
    }
}
Это было полезно?

Решение

Ваше представление может быть не строго типизированным.Попробуйте следующее:

  1. Скопируйте разметку представления
  2. Удалить представление
  3. Перейдите к действию контроллера, которое управляет представлением.
  4. Щелкните правой кнопкой мыши в этом методе и выберите опцию «Добавить представление».
  5. Убедитесь, что это строго типизированное представление и что вы правильно определили тип предполагаемой модели.
  6. Вставьте разметку представления во вновь созданное представление.

Это должно сработать.Не похоже, что вам не хватает сборки, потому что вы можете правильно отлить модель.

Следует отметить, что вы можете сделать вышеизложенное, не беспокоясь об удалении/восстановлении представления.В первой строке каждого представления имеется объявление, подобное следующему:

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

Важным разделом, который нужно понять, является атрибут Inherits, который подразумевает, что это представление расширяет MVC. ViewPage<DomainModel.Person> сорт.Свойство Model во время выполнения будет иметь тип DomainModel.Person.

Кроме того, в предыдущих версиях ASP.NET MVC существуют проблемы, которые эффективно препятствуют правильной работе строго типизированных представлений.Видеть Проблема с использованием диалогового окна «Добавить представление» в ASP.NET MVC RC1 для строго типизированного представления. для более подробной информации.

РЕДАКТИРОВАТЬ:После небольшой детективной работы всех, кто писал здесь, похоже, что Visual Studio ссылалась на более старые версии сборки, содержащие класс Person.Закрытие среды разработки, очистка всех папок obj/bin и перезапуск, похоже, устранили эту проблему.

Другие советы

Не могли бы вы опубликовать директиву <%@ Page %>?Это должно быть что-то вроде:

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

Пробовали ли вы вместо этого создать строго типизированный файл кода программной части для этого представления?

Вам нужно будет обновить свойство inherits представления, чтобы оно стало файлом кода программной части:

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

а затем в коде программной части:

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

Я не думаю, что это проблема с разрешением класса System.Web.Mvc.ViewPage, поскольку тогда страница не будет загружаться (вы получите исключение в том смысле, что System.Web.Mvc.ViewPage не может быть найден), и вы даже не сможете получить доступ к свойству Model.

Обновление 1: Обратите внимание, что вы можете быть вполне уверены, что это не проблема с загрузкой/получением типов. System.Web.Mvc.ViewPage или project.lib.models.Person.Как вы упомянули в своем вопросе, это работает, когда вы используете:

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

С использованием System.Web.Mvc.ViewPage<project.lib.models.Person> в директиве страницы и <%= Model.Name %> должно работать.Некоторые дополнительные вещи, которые я бы попробовал, если это не сработает:

  • При этом удалите директиву импорта.
  • Проверьте, добавлено ли это пространство имен в файл web.config.

Хотя ни один из этих двух вышеперечисленных вариантов не должен вызывать никаких проблем, если вы не заставите его работать с тем, что упомянуто ранее, это будет очень странный сценарий.Также обратите внимание: если вы добавили часто используемые пространства имен в файл web.config, вы можете использовать ViewPage<Person> в директиве страницы.


А Название модели на которое вы ссылаетесь, не имеет отношения к импорту пространства имен, вы получаете его из типа, установленного в директиве страницы.

Класс ViewPage имеет свойство T Model, поэтому вы получаете доступ к свойству Name (вы работаете с указанным вами типом).

для этого ваше представление должно быть строго типизировано для вашего объекта модели, в вашем случае - класс Person

все, что вам нужно, чтобы это заработало, — это добавить ссылку на project.lib и обновить производную страницу:

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top