如何在用户会话期间维护页面模型类变量?

时间:2019-04-25 17:27:17

标签: c# asp.net-core

我可以通过ASP .NET Core中的HTTP请求成功执行服务器端代码,但无法在请求之间的模型中存储信息。

我希望从私有变量切换到通过ASP NET Core的依赖项注入框架创建的服务可以解决我的问题,但可惜没有。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Earley_Parser.Language;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.ViewFeatures;

namespace Storyteller.Pages.EarleyParser {
    public class IndexModel : PageModel {
        public readonly IGrammar _grammarContext;

        public IndexModel(IGrammar grammarContext) {
            _grammarContext = grammarContext;
        }

        [HttpGet]
        public IActionResult OnGet() {
            _grammarContext.Add(new GrammarRule("", "S"));
            _grammarContext.Add(new GrammarRule("A", "S"));
            _grammarContext.Add(new GrammarRule("AA", "A"));
            _grammarContext.Add(new GrammarRule("a", "A"));
            return Page();
        }

        [HttpPost]
        public IActionResult OnPostAdd(String grammar_addRule_from, String grammar_addRule_to) {
            _grammarContext.Add(new GrammarRule(grammar_addRule_to, grammar_addRule_from));

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }

        [HttpPost]
        public IActionResult OnPostRemove(Int32 id) {
            _grammarContext.Remove(_grammarContext.ElementAt(id));

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }

        [HttpPost]
        public IActionResult OnPostUpdateStart(Char grammar_start) {
            _grammarContext.Start = grammar_start;

            return new PartialViewResult {
                ViewName = "_ContextFreeGrammar",
                ViewData = new ViewDataDictionary<Grammar_2>(ViewData, _grammarContext)
            };
        }
    }
}

我的理想情况是,在加载页面时,会初始化_grammarContext,随后的HTTP请求会更改_grammarContext的状态。 实际上确实会发生,但是,在执行任何HTTP请求之前,

IndexModel(IGrammar grammarContext)
调用

,并且_grammarContext通过依赖项注入重置其状态。如何停止这种重置?

1 个答案:

答案 0 :(得分:0)

您需要在单身有效期内注册您的服务:

services.AddSingleton<IGrammarContext, GrammarContext>();

这样,在应用程序的整个生命周期内将只创建一个实例,并且每次都将注入同一实例。

也就是说,应避免使用单例寿命。由于此处的课程非常基础,仅管理内存列表,因此并不太麻烦,但在更高级的情况下,使用单例可以束缚您并鼓励其他不良做法,例如服务定位器。