dreevo Ответов: 3

Как передать объект управления от контроллера к другому


Я пытаюсь передать объект, который является областью управления :
ConnectionOptions options = new ConnectionOptions
{
    Username = sv.User,
    Password = sv.Pass
};
ManagementScope scope = new ManagementScope(@"\\" + sv.Name + @"\root\cimv2", options);
scope.Connect();
return scope;

Это первый контроллер, в основном я получаю входные данные из формы, а затем подключаюсь к серверу с этими входными данными, используя область действия, которая позже поможет мне выполнять команды
public IActionResult Proceed(Server serverModel)
{
    if (!ModelState.IsValid) return View("Connect");
    else
    {
        try
        {
            // ---------- This is the function returning the scope ---------- \\
            ManagementScope scope = Connecting.ConnectToServer(serverModel);
            // ---------- This is the function returning the scope ---------- \\
            return RedirectToAction("Menu", "Schema");
        }
        catch (Exception e)
        {
            ViewBag.Message = e.Message.ToString();
            return View("Failed");
        }
    }
}

И это второй контроллер , обратите внимание, что я передаю область действия в качестве второго параметра, но это не будет работать, очевидно, потому что область действия неизвестна
public IActionResult ExportProceed(SchemaExport ex)
 {
     if (!ModelState.IsValid) return View("Export");
     else
     {
         try
         {
             // ---------- This is where i need to pass the scope ---------- \\
             ExportProcess.CreateDirectories(ex, scope);
             // ---------- This is where i need to pass the scope ---------- \\
             return RedirectToAction("Menu", "Schema");
         }
         catch (Exception e)
         {
             ViewBag.Message = e.Message.ToString();
             return View("Failed");
         }
     }
 }


Что я уже пробовал:

Я попытался отправить объект scope как TempData и преобразовать его с помощью json, но он говорит, что я не могу преобразовать объект ManagementScope.

3 Ответов

Рейтинг:
2

dreevo

Проблема заключается в том, что область действия инициализируется переменными, введенными из предыдущей формы.
Я решил эту проблему, создав область видимости в виде статического класса с его геттером, а затем используя ее для всех контроллеров.


Richard Deeming

Очень плохая идея - static переменные являются общими для всех запросов от всех пользователей вашего приложения.

С помощью static переменная в веб-приложении почти всегда является неправильной вещью.

dreevo

Я не мог найти никакого другого решения, позволяющего мне сохранить переменную во всех запросах.

Richard Deeming

ASP.NET состояние сеанса ядра ограничено строками, и вы не можете сериализовать a ManagementScope в JSON, поэтому вам нужно будет сериализовать данные, необходимые для создания ManagementScope в JSON и сохраните его в сеансе.

Если вы не сделали что-то странное, не должно быть проблем с сериализацией serverModel к Джону.

Рейтинг:
1

F-ES Sitecore

Когда действие вашего контроллера прекращается (после "возврата"), то все, что он создал, исчезает, все переменные, все объекты. Если вы хотите сохранить объект между запросами, вам нужно будет сохранить его в сеансе или аналогично. Однако вместо того, чтобы пытаться повторно использовать ту же область, просто создайте новую в любое время, когда она вам понадобится.


Рейтинг:
1

Dave Kreskowiak

Я согласен с F-ES, то, что вы пытаетесь сделать, - это неправильный способ сделать это.

Не создавайте область для последующего использования в другом запросе. С этим будет невозможно справиться.

Всегда создавайте нужный ресурс, когда он вам нужен, как можно позже в вашем коде, используйте его, а затем закройте и избавьтесь от него как можно раньше. Это минимизирует объем ресурсов вашего веб-приложения и минимизирует нагрузку на сервер.