代码之家  ›  专栏  ›  技术社区  ›  Mr. Smith

ASP.NET MVC-使用C将引用不同程序集的模型传递给视图#

  •  1
  • Mr. Smith  · 技术社区  · 15 年前

    给定两个程序集:

    网络计划
    项目库

    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 回复  |  直到 15 年前
        1
  •  1
  •   Community Reversed Engineer    7 年前

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

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

    这应该有效。它看起来不像您缺少了一个程序集,因为您能够正确地转换模型。

    需要注意的是,您可以这样做,而不必费心删除/恢复视图。每个视图的第一行都有一个声明,类似于以下内容:

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

    需要理解的重要部分是inherits属性,这意味着该视图扩展了MVC ViewPage<DomainModel.Person> 班级。运行时模型属性的类型将为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
  •  8
  •   Zhaph - Ben Duguid    15 年前

    请您发布您的<%@第%>页指令好吗?应该是这样的:

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

        3
  •  1
  •   eglasius    15 年前

    更新1: 请注意,您可以非常确定加载/获取类型不是问题 system.web.mvc.viewpage 项目.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上添加了该命名空间。

    虽然上面的2个都不应该引起任何麻烦,但是如果你不让它和前面提到的一起工作,这将是一个非常奇怪的场景。还要注意,如果在web.config中添加了常用的名称空间,则可以使用 ViewPage<Person> 在page指令上。


    这个 型号名称 您所引用的不必与导入命名空间有关,而是从在page指令中设置的类型中获取。

    viewpage类具有属性t model,这就是为什么您可以访问name属性(您使用的是指定的类型)。

        4
  •  0
  •   Hannoun Yassir    15 年前

    要做到这一点,您的视图应该强类型化到您的模型对象(在您的案例中是Person类)。

    您只需向project.lib添加引用,并添加更新页面derivive即可使其正常工作:

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