Asp.Net MVC:子请求的执行失败。请查看InnerException以获取更多信息

时间:2010-07-09 10:54:28

标签: validation asp.net-mvc-2

我收到以下错误消息,

  

公共操作方法'RenderMenu'   在控制器上找不到   'Web.Controllers.SiteController'。

然而,这个动作确实存在并且控制器确实存在(因为它在网站上的任何地方工作)我查看了内部异常。

  

执行子请求失败。   请检查InnerException   更多信息。

(这是内部异常......)

堆栈跟踪

  

在   System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap [TResult](Func`1   func)at   System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler的   handler,TextWriter writer,Boolean   preserveForm,Boolean setPreviousPage,   VirtualPath路径,VirtualPath   filePath,String physPath,Exception   error,String queryStringOverride)

现在,我们有一个带有动态菜单系统的网站设置,因此我们在通用控制器上使用RenderAction()来构建此菜单系统。

<% Html.RenderAction("RenderMenu", "Site"); %>

此调用是从MasterPage进行的,它可以正常工作,直到出现类似的验证错误,

 [HttpPost]
        public ActionResult Register(UserModel UserToAdd)
        {
            if(!ModelState.IsValid)
            {
                return View(UserToAdd);
            }
            //Run some validation
            if (_UserService.DoesEmailExist(UserToAdd.EMail))
            {
                TempData["error"] = "Email Address Already in use!";
                return View(UserToAdd);
            }

            //Add the user

            TempData["info"] = "User Added - " + UserO.ID;
            return View("Success");
        }

当这是一个新用户时,它工作正常,但如果有人输入已存在的电子邮件,我们会收到上述错误。这个RenderAction方法适用于整个网站(这是我们添加的第一个表格)

有什么建议吗?

2 个答案:

答案 0 :(得分:9)

修正:

RenderAction()方法在

之下
        [HttpGet]
        public ActionResult RenderMenu()
        {
            //Do Stuff
        }

删除HttpGet属性已解决了该问题。

        public ActionResult RenderMenu()
        {
            //Do Stuff
        }

很想知道为什么?

答案 1 :(得分:-1)

这是因为您的父请求是[HttpPost],并且子请求的操作与父操作的动词相同。如果您的方法标记为[HttpGet],则它不会响应[HttpPost]个请求。直接通过浏览器点击操作是有效的,因为它是GET。在POST的上下文中将操作作为子操作命中将不起作用。