ViewResult不使用ASP.NET MVC在ASP.NET WebForms项目中呈现页面内容

时间:2012-05-09 13:58:52

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

我有一个ASP.NET Web窗体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);
}

设置所有配置和程序集引用。如果我调试,我可以在我的家庭控制器上点击我的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请求详细信息:

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”。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

看起来您的视图位置错误,因为您提到Controller,Views位于名为“MVC”的文件夹下。

“Views”文件夹应位于根目录下,即ViewEngine查找视图的位置。

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