ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图

Posted

技术标签:

【中文标题】ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图【英文标题】:ASP.NET MVC - Passing a Model referencing a different assembly from a Controller to a View using C# 【发布时间】:2009-09-12 19:38:09 【问题描述】:

给定两个程序集:

项目.web 项目.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;
    

【问题讨论】:

您使用的是哪个版本的 System.Web.MVC? 【参考方案1】:

您能否发布您的 指令?它应该是这样的:

<%@ 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 属性。

【讨论】:

我试过了,没有任何区别。当我键入时,模型不会出现在可用选项列表中。我也试过 ViewData.Model,但 ViewData 也没有 Model 的定义。 你的页面指令是什么样的? 我不知道为什么你的回答得到了这么多的支持,它没有解决任何问题。正如我之前所说,我试过这个,但它不起作用。无论如何感谢您的帮助。 大概是因为在提供的信息的上下文中,它是最好的答案 - 它提供了比已接受的答案更详细的答案,因为:1)它说的和我的一样,首先,但不太详细,2)在 cmets 中提出的建议解决了您的答案(如果您也对评论进行了投票,这将有所帮助 - 我上次查看时它没有显示给我,我不知道为什么接受的答案是)。【参考方案2】:

您的视图可能不是强类型的。请尝试以下操作:

    复制视图标记 删除视图 转到驱动视图的控制器操作 在此方法中右键单击,选择“添加视图”选项。 确保这是一个强类型视图,并且您正确识别了预期模型的类型。 将您的视图标记粘贴到新创建的视图中。

这应该可以。看起来您并没有缺少装配,因为您能够正确地铸造模型。

应该注意的是,您可以在没有删除/恢复视图的痛苦的情况下执行上述操作。每个视图都有一个声明作为其第一行,类似于以下内容:

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

要理解的重要部分是 Inherits 属性,这意味着此 View 扩展了 MVC ViewPage&lt;DomainModel.Person&gt; 类。 Model 属性在运行时将是 DomainModel.Person 类型。

此外,以前版本的 ASP.NET MVC 存在一些问题,这些问题有效地阻止了强类型视图正常工作。详情请参阅Problem using Add View dialog in ASP.NET MVC RC1 for strongly typed view。

编辑:在此处发布的每个人都进行了一些侦探工作之后,看起来 Visual Studio 正在引用包含 Person 类的旧版本的程序集。关闭开发环境,清除所有 obj/bin 文件夹,然后重新启动似乎已经解决了这个问题。

【讨论】:

我试过这个没有成功。我重新创建了它,我尝试手动添加它。当我这样做时,当我开始输入时,模型甚至不会出现在智能弹出窗口中。 是的,对不起,我的意思是 @Mr. Smith:(1)你在你的 UI 项目中引用了 project.lib.models 项目吗?(2)View 声明的 Inherits 属性中显示的是什么类型? 尝试确保 System.Web.Mvc dll 在您的 GAC 中。如果您使用 OP 中描述的导入行,则可以将 Inherits 子句更改为 System.Web.Mvc.ViewPage. @Mr Smith:我建议您关闭 Visual Studio,从 bin 和 obj 文件夹中清除所有已编译的程序集,重新打开解决方案并重新编译。【参考方案3】:

更新 1: 请注意,您可以确定加载/获取类型 System.Web.Mvc.ViewPage 不是问题>project.lib.models.Person。正如您在问题中提到的,它在您使用时确实有效:

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

在页面指令上使用System.Web.Mvc.ViewPage&lt;project.lib.models.Person&gt;&lt;%= Model.Name %&gt; 必须有效。如果这不起作用,我会尝试一些额外的东西:

这样做时删除导入指令。 检查您是否在 web.config 中添加了该命名空间。

虽然以上 2 都不会造成任何问题,但如果您不让它与前面提到的内容一起工作,那将是一个非常奇怪的场景。另请注意,如果您确实在 web.config 中添加了常用命名空间,则可以在 page 指令上使用 ViewPage&lt;Person&gt;


您引用的 Model.Name 与导入命名空间无关,您可以从您在 page 指令中设置的类型中获取它。

ViewPage 类具有属性 T Model,这就是您可以访问 Name 属性的原因(您正在使用您指定的类型)。

【讨论】:

【参考方案4】:

要做到这一点,在您的 Person 类中,您的视图应该被强类型化到您的模型对象中

你需要做的只是添加对 project.lib 的引用并添加更新页面 derictive :

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

【讨论】:

以上是关于ASP.NET MVC - 使用 C# 将引用不同程序集的模型从控制器传递到视图的主要内容,如果未能解决你的问题,请参考以下文章

当移动到不同的文件夹 asp.net mvc c# 时,图像被裁剪/剪切

ASP.NET MVC 小牛之路]02

C#获取类以及类下的方法(用于Asp.Net MVC)

C#获取类以及类下的方法(用于Asp.Net MVC)

[ASP.NET MVC 小牛之路]03

干货分享:ASP.NET CORE(C#)与Spring Boot MVC(JAVA)异曲同工的编程方式总结