Передача данных от одного контроллера к другому в Dotnet Core 3.1

#c# #asp.net-mvc #asp.net-core #.net-core

#c# #asp.net-mvc #asp.net-ядро #.net-ядро

Вопрос:

Я новичок во всем шаблоне MVC, застрял со следующей проблемой:

У меня есть 2 контроллера, PayReqController и PayResController . Я пытаюсь получить доступ к данным от одного действия PayReqController к другому действию PayResController . Я пытался использовать TempData :

 TempData["tsnpac"] = tsnpac; 
 

Но это не работает, потому что нам нужно перенаправить на другой контроллер после установки TempData . Также пробовал использовать session Session["TSNPAC"] = "TSNPAC"; для доступа к нему на другом контроллере, но он выдает значение as null .

Мой сценарий заключается в PayReqController том, что внутри действия у меня есть значение, которое мне нужно получить в другом контроллере без перенаправления на этот контроллер, потому что мой вариант использования — перенаправить на какой-то другой URL-адрес, который я получаю в качестве ответа от другого сервиса.

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

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

2. Да, я устанавливаю значение в первом контроллере и перехожу на некоторый URL-адрес xyz (который я получаю от службы в качестве ответа), затем после перенаправления на этот URL-адрес и после передачи некоторых значений там я возвращаюсь ко 2-му контроллеру. Код для какого контроллера вы хотите видеть? Есть ли решение для передачи значений другому контроллеру в моем сценарии или usecase?

Ответ №1:

Для обмена данными между областью запроса (а не только между контроллерами) вы можете использовать HttpContext.Items .

для обмена данными:

 //in the  first controller 

HttpContext.Items.Add("person", person);
 

И использовать общие данные:

 //in the second controller

var person= HttpContext.Items["person"] as Person;
 

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

1. значение person равно null

2. Обратите внимание, что этот подход предназначен только для одного запроса (не для нескольких запросов).

3. Хорошо, есть ли какое-либо решение или подход для моего сценария или варианта использования, пожалуйста, предложите

Ответ №2:

 Session["TSNPAC"] = "TSNPAC";
 

Насколько я знаю, мы могли бы разделить значение сеанса между контроллерами, о том, что сеанс равен нулю, возможно, проблема связана с истекшим временем сеанса и использованием сеанса в asp.net ядро.

Для использования сеанса в asp.net Ядро, запуск должен содержать:

  • Любой из кэшей памяти IDistributedCache. Реализация IDistributedCache используется в качестве резервного хранилища для сеанса. Для получения дополнительной информации см. Раздел Распределенное кэширование в ASP.NET Ядро.
  • Вызов AddSession в ConfigureServices.
  • Вызов UseSession в Configure.

Startup.cs, как показано ниже:

 public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDistributedMemoryCache();

        services.AddSession(options =>
        {
            options.IdleTimeout = TimeSpan.FromMinutes(20); // set the session expired time.
            options.Cookie.HttpOnly = true;
            options.Cookie.IsEssential = true;
        });

        services.AddControllersWithViews();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseSession();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllerRoute(
                name: "default",
                pattern: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}
 

Используя приведенную выше конфигурацию, мы устанавливаем время истечения сеанса равным 20 минутам.

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

     public const string SessionKeyName = "_Name";
    public IActionResult Index()
    { 
        //Requires: using Microsoft.AspNetCore.Http;
        if (string.IsNullOrEmpty(HttpContext.Session.GetString(SessionKeyName)))
        {
            //set value to session
            HttpContext.Session.SetString(SessionKeyName, "The Doctor"); 
        }
        //Get value from session
        var name = HttpContext.Session.GetString(SessionKeyName);

        //used to display value in the view page.
        ViewData["name"] = name; 
        return View();
    }
 

Если вы хотите использовать session для хранения объекта, вам нужно добавить SessionExtensions, ознакомьтесь с этой статьей .

Более подробную информацию об использовании сеанса см. в разделе Состояние сеанса.

Если все еще не удается получить значение с помощью сеанса, вы можете рассмотреть возможность сохранения значения в кэше или базе данных.

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

1. Это были шаги, которые я выполнил, чтобы установить сеанс и получить доступ к нему на другой контроллер после перенаправления, но значение, которое я получаю, равно нулю, действительно ли оно в моем сценарии, могу ли я получить доступ к значению сеанса с одного контроллера на другой в Dotnet Core 3.1 MVC, несмотря на перенаправление на URL, полученный в качестве ответа отвеб-сервис и возврат к 2-му контроллеру для доступа к значению.

2. Есть ли что-нибудь конкретное, что мне нужно, чтобы попытаться не получить значение null или какой-либо другой подход, пожалуйста, предложите

3. Привет @TSNandakumar, основываясь на вашем описании, я также создал Asp.net приложение core 3.1 MVC, сеанс может быть разделен между контроллерами (создайте новый asp.net базовое приложение mvc и используйте приведенный выше код для настройки сеанса). После проверки состояния сеанса кажется, что сеанс также связан с файлом cookie, пожалуйста, проверьте браузер и убедитесь, что он разрешает файлы cookie. Кроме того, при использовании AddSession сделайте сеансовый файл cookie необходимым: services.AddSession(op => {op.Cookie.IsEssential = true;}); .

4. Привет @ Zhi Lv, не могли бы вы, пожалуйста, сослаться на мой пост ниже, что именно я пытался использовать в сеансе

Ответ №3:

Я попробовал следующие шаги: В startup.cs , в ConfigureServices(IServiceCollection services) метод `

 services.AddDistributedMemoryCache();services.AddSession(options =>
{options.IdleTimeout = TimeSpan.FromMinutes(20);options.Cookie.HttpOnly = true;options.Cookie.IsEssential = true;});
 

In Configure(IApplicationBuilder app, IWebHostEnvironment env) , app.UseSession(); In 1st Controller string merchantCode = «T S Nandakumar»; HttpContext.Session.setString(«Code», merchantCode); In 2nd Controller строка codetest = HttpContext.Session.getString(«Код»);`

Но во 2-м контроллере после перенаправления URL-адреса, получения нулевого значения, не могли бы вы сообщить мне, пропустил ли я какие-либо шаги здесь в соответствии с вашими?

Ответ №4:

Я попробовал TempData, но не такой подход, и он сработал.

Я сериализовал свой список при сохранении его в TempData

AccountController:

 TempData["BiUsers"] = JsonConvert.SerializeObject(users);
 

(users — это IEnumerable из UserModel)

И десериализовал его в другом контроллере, в котором я хотел использовать этот IEnumerable.

HomeController:

 var users = JsonConvert.DeserializeObject<IEnumerable<UserModel>>(TempData["BiUsers"].ToString());