ASP.NET 视-传递一个模式引用一个不同的组件从一个控制器以便使用C#
-
06-07-2019 - |
题
鉴于两个组件:
的项目。网
的项目。lib
这一项目。网组件引用的项目。lib其中包含了一些业务逻辑。一个简单的类项目。lib:
public class Person
{
public string Name;
}
在项目。网。控制器:
Using project.lib.models;
public class PersonController : Controller
{
Person person = new Person();
public ActionResult Index()
{
return View(person);
}
}
这是该部分在这里我有一些问题。在很多样项目中,我们看到下面在图(在这种情况的索引。aspx):
<% @Import Namespace="project.lib.models" %>
让你使用的模型对象是这样的:
<%= Model.Name %>
我还没有得到这工作像的例子,我已经做到:
<%= (Model as Person).Name %>
或
<%
var person = (Person)Model;
Response.Write(person.Name);
%>
这是为什么这样?是什么原因这thusness?评论?建议?我的类的定义如下:
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;
}
}
解决方案
您的观点可能不是强类型的。请尝试以下方法:
- 复制查看标记
- 删除视图
- 转到驱动视图的控制器操作
- 在此方法中右键单击,选择“添加视图”选项。
- 确保这是一个强类型视图,并且您可以正确识别所需模型的类型。
- 将View标记粘贴到新创建的视图中。 醇>
这应该有效。它看起来不像你错过了一个程序集,因为你能够正确地转换模型。
应该注意的是,您可以执行上述操作,而无需删除/恢复视图。每个视图都有一个声明作为其第一行,类似于以下内容:
<%@ 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存在一些问题,可以有效防止强类型视图正常工作。请参阅使用添加问题在ASP.NET MVC RC1中查看强类型视图的对话框以获取更多详细信息。
编辑:经过此处发布的所有人的一些侦探工作后,看起来Visual Studio正在引用包含Person类的程序集的旧版本。关闭开发环境,清除所有obj / bin文件夹,然后重新启动似乎解决了这个问题。
其他提示
您能否发布<!> 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: 注意,你可以相当肯定,这不是一个问题料/获取的类型 系统。网。视.ViewPage 或 的项目。lib。模型。人.正如你所提到,在你的问题,它的工作时使用:
<% @Import Namespace="project.lib.models" %>
...
<%= (Model as Person).Name %>
使用 System.Web.Mvc.ViewPage<project.lib.models.Person>
在网页上指令,和 <%= Model.Name %>
必须工作。一些额外的东西,我会尝试,如果不工作:
- 删除的进口指令的时候这样做。
- 如果你有名字空间加入上网。config。
而那些没有上述2,应该引起任何麻烦,如果你没有得到这工作有什么是前面提到,这将是一个非常奇怪的情况。还要注意的是,如果你有没有增加常用的名称空间中的网站。config可以使用 ViewPage<Person>
在网页上指令。
的 模型。名称 你是指不具有与进口空间,你会得到它的种类设置的网页的指令。
ViewPage类拥有的财产,T型,这就是为什么你会得到访问该名称属(你的工作类型的规定)。
要做到这一点,你的视图应该强烈输入你的模型对象,在你的情况下是Person类
所有你需要使它工作的是向project.lib添加refrence并添加更新页面derictive:
<%@ Page Title="" Language="C#" Inherits="System.Web.Mvc.ViewPage<Project.lib.Models.Person>" %>