VS2013 ASP.NET Автоматическое перенаправление шаблона одностраничного приложения MVC

#c# #asp.net #asp.net-mvc-4 #visual-studio-2013

#c# #asp.net #asp.net-mvc-4 #visual-studio-2013

Вопрос:

Шаблон SPA по умолчанию в ASP.NET , в Visual Studio 2013 предоставляет нам шаблон веб-сайта по умолчанию. Однако этот шаблон не позволяет просматривать страницу /Home/Index и автоматически перенаправляет на /Account/Login . Теперь я хочу использовать эту приятную функцию, но не на своей домашней странице.

Я попробовал следующее:

  1. комментирование атрибута авторизации
  2. добавление AllowAnonymous, переопределение аутентификации и т. Д. Один за другим.
 //[Authorize]
[AllowAnonymous]
[OverrideAuthentication]
public class HomeController : Controller
{
    [OverrideAuthentication]
    [AllowAnonymous]
    public ActionResult Index()
    {
        return View();
    }
}
  

Но он все равно перенаправляет меня на

http://example.com:49838/Account/Login ?returnUrl=/Account/Authorize?client_id=web&response_type=token&state=

всякий раз, когда я захожу в

http://example.com:49838/Home/Index

Как я могу это предотвратить?

Комментарии:

1. Я нашел способ, но я уверен, что это неправильный способ, прокомментируйте эту строку в app.viewmodel.js : окно. location = «/Account/Authorize?client_id=webamp;response_type=tokenamp;state=» encodeURIComponent(окно. location.hash); Если у кого-нибудь есть лучшее решение, я бы тоже хотел знать!

Ответ №1:

Сначала удалите атрибут авторизации из домашнего контроллера

 //[Authorize]
public class HomeController : Controller
  

Затем в /Views/Home/Index.cshtml удалите логику SPA (я ее прокомментировал):

 @section SPAViews {
    @Html.Partial("_Home")
}
@section Scripts{
    @*
    @Scripts.Render("~/bundles/knockout")
    @Scripts.Render("~/bundles/app")
    *@
}
  

По сути, то, что вы делаете, — это превращаете домашнюю страницу в обычную старую страницу MVC, что, я предполагаю, вы хотите сделать.

Затем вы можете перейти по ссылке на новую страницу, на которой будет размещено ваше приложение SPA (и потребуется, чтобы пользователь вошел в систему).

Ответ №2:

В вашем контроллере:

 //[Authorize]
public class HomeController : Controller
  

В вашей модели представления нокаута

 app.addViewModel({
    name: "Home",
    bindingMemberName: "home",
    factory: HomeViewModel,
    // add this line only if you require authorization, remove or set to false in your home view model
    authorize: true 
});
  

И, наконец, в вашей модели представления приложения:

 self[options.bindingMemberName] = ko.computed(function () {
    if (options.authorize amp;amp; !dataModel.getAccessToken()) {
        ...
    }
    return self.Views[options.name];
});
  

Комментарии:

1. Определенно забыл проверить пакет нокаута. Спасибо за ответ!