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<DomainModel.Person>
类。 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 文件夹,然后重新启动似乎已经解决了这个问题。
【讨论】:
我试过这个没有成功。我重新创建了它,我尝试手动添加它。当我这样做时,当我开始输入时,模型甚至不会出现在智能弹出窗口中。 是的,对不起,我的意思是更新 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 %>
必须有效。如果这不起作用,我会尝试一些额外的东西:
虽然以上 2 都不会造成任何问题,但如果您不让它与前面提到的内容一起工作,那将是一个非常奇怪的场景。另请注意,如果您确实在 web.config 中添加了常用命名空间,则可以在 page 指令上使用 ViewPage<Person>
。
您引用的 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# 将引用不同程序集的模型从控制器传递到视图的主要内容,如果未能解决你的问题,请参考以下文章