是否可以保留我现有的 .master 页面并将其与新的 ASP.NET MVC 3 Razor 视图一起使用?我试过这个:
@{
LayoutPage = "~/Views/Shared/Site.master";
}
它给了我这个错误信息:
无法呈现文件“~/Views/Shared/Site.master”,因为它不存在或不是有效页面。
是否可以保留我现有的 .master 页面并将其与新的 ASP.NET MVC 3 Razor 视图一起使用?我试过这个:
@{
LayoutPage = "~/Views/Shared/Site.master";
}
它给了我这个错误信息:
无法呈现文件“~/Views/Shared/Site.master”,因为它不存在或不是有效页面。
抱歉不行。母版页是 ASPX WebForms 视图引擎的一部分,而不是 MVC 框架,因此 Razor 无法与其互操作。
正如您所提到的,一种选择是复制母版,但您可以将母版页面分解为 Razor 和 ASPX 母版可以嵌入的一堆 ASPX 部分,而不是复制所有代码。然后,您可以开始将每个页面和部分页面逐个转换为 Razor,并最终摆脱 ASPX 大师。
实际上有一种方法可以做到这一点。Scott Hansleman 有一篇关于该主题的博客文章:http ://www.hanselman.com/blog/MixingRazorViewsAndWebFormsMasterPagesWithASPNETMVC3.aspx
这有点骇人听闻,但可行。我认为所描述的方法可以进一步封装和清理,以便您可以构建视图和控制器,而不必担心事物是如何连接在一起的。
我认为您需要在共享文件夹中查找 _Layout.cshtml ...
这是aspx和razor视图引擎之间的比较......
这也是一篇关于带有剃须刀的嵌套母版页的有趣帖子......
高温高压
MVC 不正式支持 .Net 用户控件,但您可以检索它们生成的 html。以下代码检索由数十个 ASCX 文件组成的页面生成的 HTML。
代码示例:
try{
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13";
myHTML = client.DownloadString("http//www.mysite.com/header.aspx");
}
} catch ( WebException exception )
{
using(var reader = new StreamReader(exception.Response.GetResponseStream())){
Response.Write(reader.ReadToEnd());
}
}
@Html.Raw(myHTML ); //OR Response.Write(myHTML);
@RenderBody();
我自己刚刚经历了这个过程,我发现马特霍利的这种方法很有效。
此方法通过创建使用所需母版页的标准 aspx 页面来工作。然后,您可以根据需要添加内容占位符。然后使用要使用的视图名称调用 RenderPartial。然后,来自控制器的响应会传递到您要渲染的实际视图。
完成这项工作需要更多的管道,您必须调用扩展方法才能在控制器中呈现您的视图,但是一旦设置好它就可以很好地工作。
在 Razor 中,您可以使用布局页面实现相同的功能。