我有这个(简单)代码
<% 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>
但是这个(版本)方法的路径是什么?
(或者也许还有另一个原因可以解决,我也会对这个答案持开放态度。)
答案 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。为什么在异常的情况下返回错误的版本?