1

给定两个程序集:

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

4 回答 4

8

您能否发布您的 <%@ Page %> 指令?它应该是这样的:

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

于 2009-09-16T07:28:36.450 回答
1

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

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

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

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

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

要理解的重要部分是 Inherits 属性,这意味着此 View 扩展了 MVCViewPage<DomainModel.Person>类。Model 属性在运行时将是 DomainModel.Person 类型。

此外,以前版本的 ASP.NET MVC 存在一些问题,这些问题有效地阻止了强类型视图正常工作。有关更多详细信息,请参阅在 ASP.NET MVC RC1 中使用添加视图对话框时遇到强类型视图时出现问题。

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

于 2009-09-12T19:43:11.827 回答
1

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

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

使用System.Web.Mvc.ViewPage<project.lib.models.Person>on page 指令并且<%= Model.Name %>必须有效。如果这不起作用,我会尝试一些额外的事情:

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

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


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

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

于 2009-09-19T08:19:22.010 回答
0

要做到这一点,您的视图应该在您的情况下对您的模型对象进行强类型 Person 类

使它工作所需的只是向 project.lib 添加引用并添加更新页面 derictive :

<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>
于 2009-09-20T19:29:58.033 回答