Как я могу принудительно заполнить TempData контроллера? - PullRequest
0 голосов
/ 17 октября 2018

Фон

Я исправляю проблему с окном в среде 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() или увеличить срок службы контроллера?

1 Ответ

0 голосов
/ 18 октября 2018

Переменная сеанса должна работать.

TempData предоставляет нам доступ только для продолжительности по одному запросу, тогда как переменная сеанса «хранит» свое значение в течение гораздо более длительного периода времени.

public class FooController : Controller
{
    [Route("/Users/{userId}/Foos")]
    public IActionResult Index(int userId)
    {
        System.Web.HttpContext.Current.Session["userId"] = userId; 
        //this.TempData["userId"] = userId;
        return View();
    }

    [HttpGet]
    public JsonResult Foos()
    {
        var userId = (int)System.Web.HttpContext.Current.Session["userId"]; 
        //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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...