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

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

project.web
project.lib

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

public class Person
{
    public string Name;
}

В проекте. Веб-контроллеры:

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 следующим образом:

<%= 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;
    }
}

Ответы [ 4 ]

8 голосов
/ 16 сентября 2009

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

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

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

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

<%@ 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 голос
/ 19 сентября 2009

Обновление 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 %> должно работать. Некоторые дополнительные вещи, которые я бы попробовал, если это не сработало:

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

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


Model.Name , на которое вы ссылаетесь, не имеет отношения к импорту пространства имен, вы получаете его из типа, который вы указали в директиве page.

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

1 голос
/ 12 сентября 2009

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

  1. Копировать вид разметки
  2. Удалить вид
  3. Перейти к действию контроллера, которое управляет View
  4. Щелкните правой кнопкой мыши в этом методе, выберите опцию Add View.
  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 и перезапуск, по-видимому, устранили эту проблему.

0 голосов
/ 20 сентября 2009

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

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

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
...