使用RenderAction方法会引发异常

时间:2010-12-29 21:57:21

标签: asp.net asp.net-mvc-2 asp.net-membership

我有这个(简单)代码

<% Html.RenderAction("Version", "Generic"); %>

在我的asp.net mvc 2应用程序的母版页中。 此方法返回应用程序的版本。

我的控制器中也有这个代码:

class GenericController : BaseController
    {
        [ChildActionOnly]
        public string Version()
        {
            try
            {
                string assemblyFile = Assembly.GetCallingAssembly().FullName;
                FileInfo fi = new FileInfo(assemblyFile);
                string version = fi.LastWriteTime.Year.ToString( ) + fi.LastWriteTime.Month.ToString() + fi.LastWriteTime.Day.ToString();
                return version;
            }
            catch (Exception e)
            {
                return "1.0";

            }
        }
    }

现在我收到此错误: 执行子请求失败。请查看InnerException以获取更多信息。

并且innerexcpetion是:

  

“未找到或未找到路径'/ Account / LogOn'的控制器   实现IController。“

我在想的是,代码可能无法执行,因为用户尚未登录,并尝试重定向到登录方法等。

所以我想的第一件事是在web.config中授予访问权限(就像我对其中包含css和图像的目录一样,当你没有登录时它也应该是可访问的:

<location path="Content">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>

但是这个(版本)方法的路径是什么?

(或者也许还有另一个原因可以解决,我也会对这个答案持开放态度。)

1 个答案:

答案 0 :(得分:0)

通常,控制器操作会返回ActionResult,而不是字符串。此外,您应该确保您派生的BaseController没有[Authorize]属性,实际上查看您甚至不需要从中派生的代码。可能很简单:

public class GenericController
{
    [ChildActionOnly]
    public ActionResult Version()
    {
        try
        {
            string assemblyFile = Assembly.GetCallingAssembly().FullName;
            FileInfo fi = new FileInfo(assemblyFile);
            string version = fi.LastWriteTime.Year.ToString( ) + fi.LastWriteTime.Month.ToString() + fi.LastWriteTime.Day.ToString();
            return Content(version, "text/html");
        }
        catch (Exception e)
        {
            return Content("1.0", "text/html");
        }
    }
}

另请注意,我将控制器定义为public类,而不是您的情况。最后从web.config中删除<location>部分。 ASP.NET MVC中不再使用它。

也尝试渲染这样的动作:

<%= Html.Action("Version", "Generic") %>

作为最后的评论,我可能会从控制器操作中删除try / catch。为什么在异常的情况下返回错误的版本?