Может ли ASP.NET MVC View использовать модель из другого проекта? - PullRequest
7 голосов
/ 12 марта 2009

У меня есть класс ADO.NET Entity Framework с именем Node в проекте WPF. Я хочу использовать его в другом проекте ASP.NET MVC в том же решении.

Контроллер My Node:

Public Class NodeController
    Inherits System.Web.Mvc.Controller

    Function Display(ByVal id As Guid) As ActionResult
        Dim db As New WpfApplication1.Model1Entities
        Dim m As WpfApplication1.Node = (From n In db.Node _
                                         Where n.Id = id _
                                         Select n).First
        Return View(m)
    End Function

End Class

Когда я запускаю проект и пытаюсь перейти к http://.../Node/Display/[a valid ID]

Я получаю сообщение об ошибке:

Ошибка сервера в приложении '/'.

Ошибка компиляции

Сообщение об ошибке компилятора: BC30456: «Заголовок» не является членом 'ASP.views_node_display_aspx'.

Ошибка источника:

Строка 1: <% @ Page Title = "" Language = "VB" MasterPageFile = "~ / Views / Shared / Site.Master" Inherits = "System.Web.Mvc.ViewPage (Of WpfApplication1.Node)"% >

Исходный файл: C: ... \ MvcApplication1 \ Views \ Node \ Display.aspx

Я читал, что ошибка может быть связана с конфликтом имен классов за . Но я не думаю, что это так.

Можно ли использовать модель из другого проекта для создания строго типизированного ASP.NET MVC View?

Обновление 1:

Я пытался импортировать пространство имен на моей странице Display.aspx, но ни один из

<%@ Import Namespace="WpfApplication1" %>

или

<%@ Import Namespace="SolutionName.WpfApplication1" %>

или

<%@ Import Namespace="SolutionName.WpfApplication1.Model1Entities" %>

предотвратить ошибку.

Обновление 2:

Я пытался добавить пространство имен в мой файл Views / Web.config, но не

<add namespace="SolutionName.WpfApplication1" />

ни

<add namespace="SolutionName.WpfApplication1.Model1Entities" />

предотвратить ошибку.

Обновление 3:

После добавления пространства имен я теперь получаю это предупреждение:

Пространство имен или тип, указанный в Импортирует «SolutionName.WpfApplication1» не содержит публичного участника или не может быть найден. Убедитесь, что пространство имен или тип определяется и содержит хотя бы одного публичного участника. Убедитесь, что имя импортируемого элемента не использует псевдонимы.

Это ключ?

Обновление 4:

Я переместил модель из моего WpfApplication1 в новую ClassLibrary1.

Я очистил свой контроллер.

Imports ClassLibrary1

Public Class NodeController
    Inherits System.Web.Mvc.Controller

    Function Display(ByVal id As Guid) As ActionResult
        Dim db As New Model1Entities
        Dim m As Node = (From n In db.Node _
                         Where n.Id = id _
                         Select n).First
        Return View(m)
    End Function

End Class

Я очистил свой вид.

<%@ Import Namespace="ClassLibrary1" %>
<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage(Of Node)" %>

Я больше не вижу предупреждение.

Но я все еще получаю ошибку времени выполнения.

Ответы [ 3 ]

8 голосов
/ 12 марта 2009

Дважды проверьте, что ваш Views / Web.config имеет пространство имен вашего ссылочного проекта:

<system.web>
  <pages>
    <namespaces>
      <add namespace="SolutionName.WpfApplication1.Model1Entities" />
    </namespaces>
  <pages>
</system.web>

UPDATE:

У меня нет приложений WPF для тестирования ... Я думал, что вы пытались использовать проект "Библиотека классов". Это определенно сработает. Можно ли немного реорганизовать ваше приложение, чтобы вытащить «Модели» в собственный проект? Таким образом, вы можете скомпилировать его как библиотеку классов.

ОБНОВЛЕНИЕ 2:

Странно, похоже, что ваша страница неправильно наследуется от System.Web.Mvc. Убедитесь, что ваш Views / Web.config выглядит так:

<?xml version="1.0"?>
<configuration>

  <system.web>
    <httpHandlers>
      <add path="*" verb="*"
          type="System.Web.HttpNotFoundHandler"/>
    </httpHandlers>
    <pages validateRequest="false"
            pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
            userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
      <controls>
        <add assembly="System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
      </controls>
      <namespaces>
        <add namespace="SolutionName.WpfApplication1.Model1Entities"/>
      </namespaces>
    </pages>

  </system.web>

  <system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <handlers>
      <remove name="BlockViewHandler"/>
      <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler"/>
    </handlers>
  </system.webServer>
</configuration>

ОБНОВЛЕНИЕ 3: Ошибка выполнения выглядит так, как будто это не проект MVC.

6 голосов
/ 12 марта 2009

Вы определенно можете! Просто убедитесь, что вы включили правильные пространства имен в свой вид:

<%@ Import Namespace="MyEntityNamespace" %>
1 голос
/ 12 марта 2009

Щелкните правой кнопкой мыши ссылки в веб-проекте и выберите «добавить ссылку». После этого используйте «проект».

После этого вы можете пойти с ответом, предоставленным Рексом (не уверен насчет синтаксиса Vb там. Я использую c #, и это синтаксис c #)

У меня это работает.

EDIT:

использование

не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...