Фон
Я исправляю проблему с окном в среде MVC, когда нажатие кнопки переключения не приводит к обновлению данных, поэтому вместо этого требуется обновление.
Файлы
Foos \ Index.cshtml
<environment>
<script src="~/js/services/fooController.js"/>
</environment>
<div ng-controller="FooController" ng-init="loadFoos()" ng-cloak>
<md-list-item ng-repeat="foo in foos" ng-click="null">
<div layout="row">
<div>{{foo.name}}</div>
<div>{{foo.flag}}</div>
<div>
<md-button ng-click="toggleFlag(foo)">
<md-icon>myIcon</md_icon>
</md-button>
</div>
</div>
</md-list-item>
</div>
fooController.js
app.controller('FooController', ['$scope', 'fooService', function($scope, fooService) {
$scope.loadFoos = function() {
fooService.Load().then(function (response) {
$scope.foos = response.foos;
});
};
$scope.toggleFlag = function(foo) {
fooService.toggleFlag(foo).then(function () {
$scope.loadFoos();
});
}
}]);
fooService.js
(function () {
'use strict';
angular.module('MyModule').factory('fooService', ['$http', fooService]);
function fooService($http) {
return {
loadFoos: loadFoos,
toggleFlag: toggleFlag
};
function loadFoos() {
return $http.get("/Foos/Foos").then(successCallBack);
}
function toggleFlag(foo) {
return $http.post("/Foos/ToggleFlag", foo);
}
function successCallBack(response) {
return response.data;
}
};
})();
FooController.cs
Наконец, все это возвращается к контроллеру C #, который выглядит следующим образом:
public class FooController : Controller
{
[Route("/Users/{userId}/Foos")]
public IActionResult Index(int userId)
{
this.TempData["userId"] = userId;
return View();
}
[HttpGet]
public JsonResult Foos()
{
var userId = int.Parse(this.TempData["userId"].ToString());
IEnumerable<Foo> foos = new Foo[0];
//to keep this as small as possible for reproducing
return this.Json(new { foos = foos });
}
[HttpPost]
[Route("/Foos/ToggleFlag")]
public ActionResult ToggleFlag([FromBody] Foo foo)
{
//delegate updating to writer; omitted for reproducibility
return this.Ok();
}
}
Основная проблема
Когда окно загружается, вызывается Index()
и автоматически заполняетсяTempData
с соответствующим идентификатором пользователя из URL.Затем он может позвонить Foos()
и вернуть соответствующий список.Однако при вызове через $scope.toggleFlag
он не вызывает Index()
, заставляя Foos()
генерировать исключение при попытке доступа к несуществующему TempData["userId"]
.
Вопрос
Как мне заполнить TempData
при каждом вызове Foos()
или увеличить срок службы контроллера?