【问题标题】:ViewResult Not Rendering Page Content in ASP.NET WebForms Project with ASP.NET MVCViewResult 不使用 ASP.NET MVC 在 ASP.NET WebForms 项目中呈现页面内容
【发布时间】:2012-05-18 01:28:45
【问题描述】:

我有一个 ASP.NET Web Forms APP,我想一次将其迁移到 ASP.NET MVC。我已将 MVC 设置为在 webforms 应用程序中运行。我已经正确设置了所有内容,如果我将 ASP.NET MVC 文件夹(控制器、视图)放在项目中名为 MVC 的子文件夹中,并将全局 asax 中的路由设置为

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    routes.IgnoreRoute("{resource}.aspx/{*pathInfo}");
    routes.MapRoute("Default", // Route name
        "w/{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = "" } // Parameter defaults
    );
}

protected void Application_Start()
{
    RegisterRoutes(RouteTable.Routes);
}

所有配置和程序集引用均已设置。如果我进行调试,我可以在我的 Home 控制器上的 Index 方法中设置一个断点。

public class HomeController
    : Controller
{
    public ActionResult Index()
    {
        this.HttpContext.Trace.Write("Hrm...");
        return View("index", (object)"Hello");
    }
}

正在发生的问题是

return View("index", (object)"Hello");

如果 MVC 无法找到视图,则通常不会返回错误状态代码或搜索列表。相反,我收到了 200 个 http 响应,而响应的内容正文中没有任何内容。

这里是http请求的详细信息:

GET http://localhost.:2396/w/home/index2 HTTP/1.1
Accept: */*
Accept-Language: en-us
User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; MS-RTC LM 8; InfoPath.2; .NET CLR 1.1.4322; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: localhost.:2396
Pragma: no-cache
Cookie: ASP.NET_SessionId=3yqf2t55sckemhmxq2bhibmq

HTTP/1.1 200 OK
Server: ASP.NET Development Server/9.0.0.0
Date: Wed, 09 May 2012 12:42:43 GMT
X-AspNetMvc-Version: 2.0
Cache-Control: private
Content-Length: 0
Connection: Close

上面的请求转到 index2,这是一个不存在的操作,它不会给我一个错误。我怀疑索引操作中的 ViewResult 正在引发异常,但不知何故它在某处被抑制了。我继承了这个代码库,所以我只是想弄清楚发生了什么。

在 web.config 中我已经配置了错误处理,这样我应该能够看到任何错误消息,但这仍然不能解释为什么 http 状态代码总是 200。

<customErrors mode="Off"/>

<httpErrors errorMode="DetailedLocalOnly"/>

另一个快速说明,如果我替换

return View("index", (object)"Hello");

return Content("abc");

它会在http响应的内容体中正确输出“abc”。

有什么想法吗?

【问题讨论】:

  • 快速问:如果返回 View() 或返回 View("index") 会怎样?
  • 我只是再次测试以确定,但结果都一样。

标签: c# asp.net asp.net-mvc error-handling webforms


【解决方案1】:

似乎您的视图位置错误,因为您提到控制器,视图位于名为“MVC”的文件夹下。

“Views”文件夹应该在根目录下,即 ViewEngine 查找视图的地方。

更新: 您可以使用自定义 ViewEngine 覆盖此默认行为。为此实现IViewEngine 接口,它有一个名为FindView 的方法,您可以在其中实现自己的逻辑来扫描不同的位置。

【讨论】:

  • 是的……但他似乎会让 ysod 抱怨找不到风景。
  • 哈!谢谢。我发誓我试过这个,它之前没有解决它。但是当我这次重新安置它们时,它起作用了。我假设我可以使用区域注册将它们重新定位到 MVC 子文件夹中。只需要研究一下我是如何设置的。
  • @andrew 是的,我没有看到任何 YSOD,如调用 INDEX2 所示。不过还没弄明白为什么。
  • 实际上,为了方便起见,我将创建自己的视图扩展方法来添加“~/mvc/views/”,这样我就可以将它们保存在子文件夹中。再次感谢大家。
  • 很好的建议。我最终为 Controller.View(string, string, object) 编写了一个覆盖来预先设置路径。这不如您的解决方案优雅,并阻止您使用共享文件夹和东西,但它是一个简单的快速修复。我真正想看到的是 asp.net 团队,从视图引擎创建一个抽象,类似于“IViewLocator”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-06
  • 2011-03-21
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多