использование метода RenderAction вызывает исключение - PullRequest
1 голос
/ 30 декабря 2010

у меня есть этот (простой) код

<% 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 для получения дополнительной информации.

и неэкспертиза:

"Контроллер для пути '/ Account / LogOn' не найден или не найден реализовать IController. "

Я думал о том, что, возможно, код не может быть выполнен, поскольку пользователь еще не вошел в систему и пытается перенаправить на метод входа и т. Д.

Итак, первое, о чем я подумал, это предоставить доступ в web.config (как и в случае с каталогом, содержащим css и изображения, он также должен быть доступен, когда вы не вошли в систему:

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

но каков путь для этого (версии) метода?

(или, возможно, есть другая причина для исключения, я тоже открыт для этого ответа:))

1 Ответ

0 голосов
/ 30 декабря 2010

Обычно действия контроллера возвращают 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, который не был в вашем случае.Наконец удалите раздел <location> из вашего web.config.Это больше не используется в ASP.NET MVC.

Также попробуйте выполнить рендеринг действия следующим образом:

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

В качестве последнего замечания я бы, вероятно, удалил try / catch из действия контроллера,Зачем возвращать неверную версию в случае исключения?

...