当我尝试访问视图时,在我的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());
}
所以是的,它返回正确的模型,而不是匿名类型。
答案 0 :(得分:5)
花了整整一天搜索互联网并进行研究。我比较了我的旧解决方案和新解决方案,并找到了罪魁祸首。
事实证明,除了内容和其他一些代码背后的差异之外,主要的不同之处在于,在破碎的解决方案中我实施了一个自定义webviewpage !在一个充满启发的时刻,我来到了这里。这让我想到了下一个问题,为什么它只打破强类型的视图,但它能够导航到模型?
简单的答案是,自定义webviewpage由常规版本和通用版本组成。通用版本用于强类型视图。
我检查了自定义的webviewpage,我从@haacked在他的博客上做出了贡献。该博客上最后一条评论之一是一个人(马修),他使用强类型视图并遇到同样的问题。因此,解决方案是修改自定义webviewpage的通用版本,以便不是从自定义非泛型版本继承,而是从WebViewPage继承。然后所有强类型视图再次起作用,CS1061错误就消失了。
我还强烈推荐使用@hatchet提示,在Release版本中启用BuildViews(不在Debug中,因为它会延长重建阶段)。
自定义WebViewPage的示例虽然已经发布,但高度很有用,现在我可以创建自己的帮助程序而不会过度拥挤Html和Url帮助程序。奇怪的是,当我找到类似的东西时,他是唯一真正的文章处理在MVC3中制作自定义助手的问题。