Перенаправить на страницу входа, когда ожидаемое значение не отображается - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть скрытое поле, которое отображает целочисленный siteId, определенный в моей viewbag

Иногда этого нет, если предположить, что это может быть связано с сеансами в MVC

Когда это происходит, как я могу перенаправить на свою страницу входа? В настоящее время это приводит к ошибке приведения в моей cshtml странице

Если ошибка произошла в моем контроллере, это легко, но я не знаю, как бороться с ошибками в файлах cshtml

Мой cshtml имеет это

<div>       
    @(Html.Hidden("SiteID", (int) ViewBag.SiteID))
</div>

Кажется, будто мой пользователь некоторое время остается на сайте, затем пытается обновить или сделать что-то еще, что я получаю cannot convert null to 'int' because it is a non nullable type

Пол

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

Вы можете использовать Actionfilter перед тем, как перейти к действию или после того, как вы обработаете действие и проверите значение мешка просмотра, а если оно не то, что вам нужно, то перенаправьте оттуда.

Примерно так:

public class ViewBagValuePresentAttribute : ActionFilterAttribute
    {

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            var s = filterContext.Controller.ViewBag.SiteID;
            if (s == null)
            {
                UrlHelper helper = new UrlHelper(filterContext.RequestContext);
                filterContext.Result = new RedirectResult(helper.Action("login", "Account"));
            }
            base.OnActionExecuted(filterContext);
        }

Затем вы просто помещаете атрибут фильтра поверх действия или контроллера, для которого хотите, чтобы он был активен, например:

[ViewBagValuePresent]
public class EditController : Controller
{}

Вы можете прочитать немного больше о фильтрах действий здесь

0 голосов
/ 06 ноября 2018

Как прокомментировали другие, это не является обязанностью View для управления. Вы должны иметь доступ ко всем переменным, пока они находятся в коде уровня контроллера, и вы должны обращаться с ним соответствующим образом.

Один из способов сделать это - использовать фильтр. В методе OnActionExecuted вы можете проверить, заполняется ли значение, а затем перенаправить на страницу входа. Может быть, что-то вроде этого:

public class SiteIdFilter : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        bool shouldRedirect = SomeMethodToCheckViewBag();
        if (shouldRedirect)
        {
             filterContext.Result = new new RedirectToRouteResult("SystemLogin", routeValues);
        }
    }
}

Этот ответ Проверка наличия свойства ViewBag для условного внедрения JavaScript и метода расширения для проверки пакета вида, который выглядит многообещающе

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...