ASP.NET MVC - 使用C#将引用不同程序集的模型从Controller传递到View

时间:2009-09-12 19:38:09

标签: c# asp.net-mvc views models

鉴于两个集会:

  

project.web
  project.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对象:

<%= 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 个答案:

答案 0 :(得分:8)

您能否发布您的&lt;%@ Page%&gt;指示?它应该是这样的:

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

您是否尝试过为此视图创建强类型代码隐藏文件?

您需要将视图的inherits属性更新为代码隐藏文件:

<%@ 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 :(得分:1)

您的观点可能不是强类型的。请尝试以下方法:

  1. 复制查看标记
  2. 删除视图
  3. 转到驱动视图的控制器操作
  4. 在此方法中右键单击,选择“添加视图”选项。
  5. 确保这是一个强类型视图,并且您可以正确识别所需模型的类型。
  6. 将View标记粘贴到新创建的视图中。
  7. 这应该有效。它看起来不像你错过了一个程序集,因为你能够正确地转换模型。

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

    <%@ 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文件夹,然后重新启动似乎解决了这个问题。

答案 2 :(得分:1)

更新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上添加了该命名空间。

虽然上面这两个中没有一个会造成任何麻烦,但如果你没有让它与之前提到的一起工作,那将是一个非常奇怪的场景。另请注意,如果您确实在web.config中添加了常用的命名空间,则可以在页面指令上使用ViewPage<Person>


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

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

答案 3 :(得分:0)

要做到这一点,你的视图应该强烈输入你的模型对象,在你的情况下是Person类

所有你需要使它工作的是向project.lib添加refrence并添加更新页面derictive:

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