在强类型视图中使用LabelFor获取“对象不包含xxx的定义”

时间:2012-05-28 13:12:01

标签: c# asp.net-mvc asp.net-mvc-3 visual-studio-2010

当我尝试访问视图时,在我的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; }
    }
}

View有这样的东西(部分,只是把产生错误的部分放在那里,但是没有过去...

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

命名空间是正确的,但是intellisense在标记的.From部分显示为红色,就像它不能识别模型一样,但是这种情况也适用于那些有效的视图。

当我访问View时出现以下错误:

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)视图中的模型引用具有正确的完全限定模型name(d)模型类存在(e)除了在该视图上的运行时,没有编译错误。

顺便说一下,错误发生在任何地方我有@ Html.LabelFor,所以例如股票LogOn.cshtml有一行产生同样的错误:

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

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

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

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

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

1 个答案:

答案 0 :(得分:5)

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

事实证明,除了内容和其他一些代码背后的差异之外,主要的不同之处在于,在破碎的解决方案中我实施了一个自定义webviewpage !在一个充满启发的时刻,我来到了这里。这让我想到了下一个问题,为什么它只打破强类型的视图,但它能够导航到模型?

简单的答案是,自定义webviewpage由常规版本和通用版本组成。通用版本用于强类型视图。

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

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

自定义WebViewPage的示例虽然已经发布,但高度很有用,现在我可以创建自己的帮助程序而不会过度拥挤Html和Url帮助程序。奇怪的是,当我找到类似的东西时,他是唯一真正的文章处理在MVC3中制作自定义助手的问题。