ASP.NET MVC强类型视图编译错误

时间:2010-08-23 17:53:04

标签: .net asp.net-mvc asp.net-mvc-2 strongly-typed-view

这是一个奇怪的。我改变了一些东西(不确定是什么),现在我的应用程序的视图在运行时没有编译。

视图本身是强类型的:

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

当我访问该页面时,它无法编译,说:

  

CS1061:'object'不包含'Log'的定义,并且没有扩展方法'Log'可以找到接受'object'类型的第一个参数(你是否缺少using指令或汇编引用?)< / p>

漂亮的标准错误。相应的源代码行是:

<%= Html.HiddenFor(model => model.Log) %>

当我查看编译器生成的代码时,我看到视图的基类没有强类型:

[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute()]
public class views_operator_create_aspx
    : global::System.Web.Mvc.ViewPage, // NOT STRONGLY TYPED
      System.Web.SessionState.IRequiresSessionState,
      System.Web.IHttpHandler {

所以我的问题是,是什么导致视图编译器忽略了视图定义中的Inherits属性?

我应该指出同一控制器上的其他视图正在运行,并且它们具有与上面所示完全相同的页面声明。

编辑有人知道生成的源代码文件在哪里存在,假设它存在于某个地方吗?

编辑我找到了罪魁祸首(我在下面的回答中),但我不知道为什么会这样。如果有人能解释我会很感激!

4 个答案:

答案 0 :(得分:2)

您是否在Web.Config中正确引用了OperatorModel?这将允许您明确引用OperatorModel

<namespaces>
    <add namespace="My.Namespace"/>

或者您可以将Inherits值更改为:

Inherits="System.Web.Mvc.ViewPage<My.Namespace.OperatorModel>"

此外,将模型对象传递给视图时,请确保检查为null或返回空OperatorModel

return View(operatorModel 
    ?? new OperatorModel() { Text = "I can has not found!" });

答案 1 :(得分:1)

我发现当我有类似这样的奇怪错误时,有时如果我删除所有文件的阴影副本,它将清除它。你会在:

找到它
%SYSTEMROOT%\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files

替换您在上面那行中使用的任何版本的框架。删除与项目对应的所有文件(或只删除目录中的所有文件)。

您可能必须关闭w3p服务以确保它可以删除所有文件,然后您可以将其删除。

此外,我相信您会在那里找到您正在寻找的生成的源代码。

答案 2 :(得分:1)

您没有碰巧删除位于/ Views文件夹根目录下的那个特殊的,神奇的web.config文件,是吗?

[这个月至少抓住我一次]

答案 3 :(得分:0)

好的,所以我把我的观点减少到了这个:

<%@ Page Language="C#"
         MasterPageFile="~/Views/Shared/Site.Master"
         Inherits="System.Web.Mvc.ViewPage<MyNamespace.OperatorModel>" %>
<%@ Import Namespace="MyNamespace.Data" %>

<asp:Content ContentPlaceHolderID="MainContent" runat="server">
    <%= GetType() %><br />
    <%= GetType().BaseType %><br />
    <%= GetType().BaseType.BaseType %>
</asp:Content>

即使所有内容区域都为空,输出也是如此:

  

ASP.views_operator_create_aspx
  System.Web.Mvc.ViewPage
  System.Web.UI.Page

但如果删除<%@ Import行,我就明白了:

  

ASP.views_operator_create_aspx
  System.Web.Mvc.ViewPage`1 [MyNamespace.OperatorModel]
  System.Web.Mvc.ViewPage

我不知道为什么导入会导致页面不再强类型化。谁能解释一下?有关如何调试或跟踪编译的任何提示都会很好。我现在可以继续编码,这很好,但这不是一个非常令人满意的问题。