#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());