ASP.NET MVC View可以使用来自不同项目的模型吗?

时间:2009-03-12 13:51:02

标签: asp.net-mvc entity-framework

我在WPF项目中有一个名为Node的ADO.NET Entity Framework类。我想在同一解决方案中的不同ASP.NET MVC项目中使用它。

我的节点控制器:

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:   'Title'不是其成员   'ASP.views_node_display_aspx'。

     

来源错误:

     

第1行:<%@ Page Title =“”Language =“VB”MasterPageFile =“〜/ Views / Shared / Site.Master”Inherits =“System.Web.Mvc.ViewPage(Of WpfApplication1.Node)” %GT;

     

源文件:   C:... \ MvcApplication1 \视图\节点\ Display.aspx

我读过这个错误可能是由于a codebehind class naming conflict造成的。但我认为这不是这种情况。

我是否可以不使用其他项目中的模型来创建强类型的ASP.NET MVC视图?

更新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 个答案:

答案 0 :(得分:8)

仔细检查您的Views / Web.config是否具有引用项目的命名空间:

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

更新:

我没有任何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项目。

答案 1 :(得分:6)

你绝对可以!只需确保在视图中包含正确的命名空间:

<%@ Import Namespace="MyEntityNamespace" %>

答案 2 :(得分:1)

右键单击Web项目中的引用,然后选择“添加引用”。之后使用“项目”。

之后你可以使用Rex提供的答案(不是那里的Vb语法。我使用c#并且它是c#的语法)

它对我有用。

编辑:

使用