asp.net mvc3 - Controller方法返回View(viewName,string),但随之而来的是怪异

时间:2011-02-23 03:37:01

标签: asp.net-mvc-3

有没有人见过这个问题?我是一个ASP.NET MVC新手。我有一个使用.aspx和.ascx视图的ASP.NET MVC 3站点。在整个站点中,我使用返回View()或在我的控制器方法中返回View(viewName),它指向相应的aspx / ascx视图。但是,在我的股票AccountController(修改为使用DotNetOpenAuth)中,我采用相同的方法,但MVC框架不寻求aspx或ascx视图。相反,它正在搜索.cshtml或.vbhtml视图的路径(Razor引擎我假设)。为什么它只是寻找像我网站其余部分的aspx和ascx视图?控制器方法如下:

public ActionResult Authenticate()
{
    var response = openid.GetResponse();
    var statusMessage = "";
    if (response == null)
    {
        Identifier id;
        //make sure your users openid_identifier is valid.
        if (Identifier.TryParse(Request.Form["openid_identifier"], out id))
        {
            try
            {
                //request openid_identifier
                return openid.CreateRequest(Request.Form["openid_identifier"])
                   .RedirectingResponse.AsActionResult();
            }
            catch (ProtocolException ex)
            {
                statusMessage = ex.Message;
                return View("LogOn", statusMessage);
            }
        }
        else
        {
            statusMessage = "Invalid identifier";
            return View("LogOn", statusMessage);
        }
    }
    else
    {
        //check the response status
        switch (response.Status)
        {
            //success status
            case AuthenticationStatus.Authenticated:
                Session["FriendlyIdentifier"] = response.FriendlyIdentifierForDisplay;
                FormsAuthentication.SetAuthCookie(response.ClaimedIdentifier, false);

                //TODO: response.ClaimedIdentifier, to login or create new account 

                return RedirectToAction("Index", "Home");

            case AuthenticationStatus.Canceled:
                statusMessage = "Canceled at provider";
                return View("LogOn", statusMessage);

            case AuthenticationStatus.Failed:
                statusMessage = response.Exception.Message;
                return View("LogOn", statusMessage);
        }
    }
    return View("LogOn");
}

错误详情如下:

  

视图'LogOn'或其主人没有   发现或没有视图引擎支持   搜索位置。下列   搜索地点:   〜/ Views / Account /取消   provider.master   〜/ Views / Shared / Cancelled at   provider.master   〜/查看/帐号/ LogOn.cshtml   〜/查看/帐号/ LogOn.vbhtml   〜/查看/共享/ LogOn.cshtml   〜/查看/共享/ LogOn.vbhtml   〜/ Views / Account /取消   provider.cshtml   〜/ Views / Account /取消   provider.vbhtml   〜/ Views / Shared / Cancelled at   provider.cshtml   〜/ Views / Shared / Cancelled at   provider.vbhtml

     

描述:未处理的异常   在执行期间发生   当前的网络请求。请查看   堆栈跟踪以获取更多信息   错误及其来源   代码。

     

异常详细信息:   System.InvalidOperationException:The   查看'LogOn'或其主人没有   发现或没有视图引擎支持   搜索位置。下列   搜索地点:   〜/ Views / Account /取消   provider.master   〜/ Views / Shared / Cancelled at   provider.master   〜/查看/帐号/ LogOn.cshtml   〜/查看/帐号/ LogOn.vbhtml   〜/查看/共享/ LogOn.cshtml   〜/查看/共享/ LogOn.vbhtml   〜/ Views / Account /取消   provider.cshtml   〜/ Views / Account /取消   provider.vbhtml   〜/ Views / Shared / Cancelled at   provider.cshtml   〜/ Views / Shared / Cancelled at   provider.vbhtml

     

来源错误:

     

生成了未处理的异常   在执行当前   网络请求。有关的信息   异常的起源和位置   可以使用例外来识别   堆栈跟踪下面。

     

堆栈追踪:

     

[InvalidOperationException:视图   找不到“LogOn”或其主人   没有视图引擎支持搜索   位置。以下地点   被搜查:   〜/ Views / Account /取消   provider.master   〜/ Views / Shared / Cancelled at   provider.master   〜/查看/帐号/ LogOn.cshtml   〜/查看/帐号/ LogOn.vbhtml   〜/查看/共享/ LogOn.cshtml   〜/查看/共享/ LogOn.vbhtml   〜/ Views / Account /取消   provider.cshtml   〜/ Views / Account /取消   provider.vbhtml   〜/ Views / Shared / Cancelled at   provider.cshtml   〜/ Views / Shared / Cancelled at   provider.vbhtml]
  System.Web.Mvc.ViewResult.FindView(ControllerContext   上下文)+315050
  System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext   上下文)+129
  System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext   controllerContext,ActionResult   actionResult)+13
  System.Web.Mvc&LT;&GT; C_ DisplayClass1c.b _19()   +23 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilter(IResultFilter   filter,ResultExecutingContext   preContext,Func 1 continuation) +260 System.Web.Mvc.<>c__DisplayClass1e.<InvokeActionResultWithFilters>b__1b() +19 System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList 1个过滤器,   ActionResult actionResult)+177
  System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext   controllerContext,String actionName)   +343 System.Web.Mvc.Controller.ExecuteCore()   +116 System.Web.Mvc.ControllerBase.Execute(RequestContext   requestContext)+97
  System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(的RequestContext   requestContext)+10
  System.Web.Mvc&LT;&GT; C_ DisplayClassb.b _5()   +37 System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass1.b _0()   +21 System.Web.Mvc.Async。&lt;&gt; c_ DisplayClass8 1.<BeginSynchronous>b__7(IAsyncResult _) +12 System.Web.Mvc.Async.WrappedAsyncResult 1.End()   +62 System.Web.Mvc。&lt;&gt; c _DisplayClasse.b_ d()   +50 System.Web.Mvc.SecurityUtil.b _0(行动   f)+7
  System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(动作   行动)+22
  System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult的   asyncResult)+60
  System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult的   结果)+9
  System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()   +8841105 System.Web.HttpApplication.ExecuteStep(IExecutionStep   步,布尔&amp; completedSynchronously)   184

由于 单

1 个答案:

答案 0 :(得分:25)

密钥位于例外的第一行:

The view 'LogOn' or its master was not found or no view engine supports 
the searched locations. The following locations were searched: 
~/Views/Account/Canceled at provider.master 

如果将两个字符串传递给View(),则第一个字符串是视图名称,第二个字符串是要使用的主视图或模板的名称。如果要将statusMessage作为视图的模型传递,可以将其强制转换为对象,这会强制调用传递模型的被覆盖的View() method

return View("LogOn", (object)statusMessage);

您显然正在获取“已取消的提供程序”消息并将其作为要使用的母版页名称传递。如果“Logon.aspx”视图使用了母版页,并且您在共享视图文件夹中有一个主页“在provider.master上取消”,则会加载“LogOn.aspx”视图并强制它使用“取消在provider.master“主页面,即使默认情况下设置为使用不同的母版页:

string statusMessage = "Canceled at provider";
return View("LogOn", statusMessage);