1

当我尝试访问视图时,我的 MVC3 Razor 应用程序 (ASP.NET) 出现问题模型看起来像这样(已删除注释)

namespace MvcTest.Models {
        public class ContactMeModel {
        public string From { get; set; }
        public string Subject { get; set; }
        public string Message { get; set; }
    }
}

视图有这样的东西(部分,只是放置给出错误的部分,不会超过那个......

@model MvcTest.Models.ContactMeModel
@{
     ViewBag.Title = "test"
}
@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <div class="editor-label">
         @Html.LabelFor(model => model.From)
    </div>
}

命名空间是正确的,但智能感知在标记的 .From 部分显示为红色,就好像它无法识别模型一样,但这也适用于工作的视图。

当我访问视图时,出现以下错误:

CS1061: 'object' does not contain a definition for 'From' and no extension method 'From' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

这很奇怪,因为 (a) Mvc web 项目具有对包含模型的 DLL 的引用 (b) 整个项目已被清理和重建 (c) 视图中的模型引用具有正确的完全限定模型名称 (d ) 模型类存在 (e) 除了在该视图上运行时没有编译错误。

顺便说一句,错误发生在我有@Html.LabelFor 的任何地方,因此例如股票 LogOn.cshtml 有一行产生相同的错误:

@Html.LabelFor(m => m.UserName)

在“intellisense”中,我看到“用户名”文本带有一条锯齿形红线下划线,并且 intellisense 提到了同样的错误。但是,如果在同一页面上,我将 @model 行悬停在模型名称上并执行“转到定义”VS 将我带到定义。所以,它知道模型是什么,但不完全知道?!如果模型命名空间不正确,我在选择“转到定义”时会收到“导航”错误。

控制器操作方法如下所示:

    public ActionResult Contact()
    {
        return View(new Coralys.PanamaVibes.Mvc.Models.ContactMeModel());
    }

所以是的,它返回正确的模型而不是匿名类型。

4

1 回答 1

6

花了一整天的时间在互联网上搜索和研究。我比较了我的旧解决方案和新解决方案,找到了罪魁祸首。

事实证明,除了内容和背后的一些其他代码的差异之外,主要区别在于,在损坏的解决方案中,我实现了一个自定义 webviewpage!这是在我顿悟的时候想到的。所以这让我想到了下一个问题,为什么它只破坏强类型视图,却能够导航到模型?

简单的答案是,自定义网页浏览页面由普通版本和通用版本组成。通用版本用于强类型视图。

我检查了我从@haacked 在他的博客上的贡献中增强的自定义网页视图。该博客上最后的评论之一是一个人(马修)使用强类型视图并遇到同样的问题。因此,解决方案是修改自定义 webviewpage 的通用版本,以便它不是从自定义非通用版本继承,而是从 WebViewPage 继承。然后所有强类型视图再次工作,CS1061 错误消失了。

我还强烈推荐@hatchet 的提示,以在 Release 版本中启用 BuildViews(而不是在 Debug 中,因为它延长了重建阶段)。

自定义 WebViewPage 的示例虽然在发布时已损坏,但非常有用,现在我可以创建自己的助手,而不会过度拥挤 Html 和 Url 助手。奇怪的是,当我寻找类似的东西时,他的文章是唯一真正涉及在 MVC3 中制作自定义助手问题的文章。

于 2012-05-28T21:55:36.800 回答