鉴于两个集会:
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;
}
}
答案 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)
您的观点可能不是强类型的。请尝试以下方法:
这应该有效。它看起来不像你错过了一个程序集,因为你能够正确地转换模型。
应该注意的是,您可以执行上述操作,而无需删除/恢复视图。每个视图都有一个声明作为其第一行,类似于以下内容:
<%@ 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 %>
必须有效。如果不起作用,我会尝试一些额外的事情:
虽然上面这两个中没有一个会造成任何麻烦,但如果你没有让它与之前提到的一起工作,那将是一个非常奇怪的场景。另请注意,如果您确实在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>" %>