簡體   English   中英

在不同的 controller 操作方法之間傳遞數據

[英]Passing data between different controller action methods

我正在使用ASP.NET MVC 4 我正在嘗試將數據從一個 controller 傳遞到另一個 controller。 我沒有做對。 我不確定這是否可能?

這是我要從中傳遞數據的源操作方法:

public class ServerController : Controller
{
     [HttpPost]
     public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
     {
          XDocument updatedResultsDocument = myService.UpdateApplicationPools();

          // Redirect to ApplicationPool controller and pass
          // updatedResultsDocument to be used in UpdateConfirmation action method
     }
}

我需要將它傳遞給此 controller 中的此操作方法:

public class ApplicationPoolController : Controller
{
     public ActionResult UpdateConfirmation(XDocument xDocument)
     {
          // Will add implementation code

          return View();
     }
}

我在ApplicationPoolsUpdate操作方法中嘗試了以下操作,但它不起作用:

return RedirectToAction("UpdateConfirmation", "ApplicationPool", new { xDocument = updatedResultsDocument });

return RedirectToAction("UpdateConfirmation", new { controller = "ApplicationPool", xDocument = updatedResultsDocument });

我將如何實現這一目標?

HTTP 和重定向

讓我們首先回顧一下 ASP.NET MVC 的工作原理:

  1. 當一個 HTTP 請求進來時,它會與一組路由進行匹配。 如果路由與請求匹配,則將調用與該路由對應的控制器操作。
  2. 在調用 action 方法之前,ASP.NET MVC 執行模型綁定。 模型綁定是將 HTTP 請求的內容(基本上只是文本)映射到操作方法的強類型參數的過程

讓我們也提醒自己什么是重定向:

HTTP 重定向是 Web 服務器可以發送給客戶端的響應,告訴客戶端在不同的 URL 下查找請求的內容。 新 URL 包含在網絡服務器返回給客戶端的Location標頭中。 在 ASP.NET MVC 中,您通過從操作返回RedirectResult來執行 HTTP 重定向。

傳遞數據

如果您只是傳遞簡單的值,如字符串和/或整數,您可以將它們作為查詢參數傳遞到Location標頭的 URL 中。 如果你使用類似的東西會發生這種情況

return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });

正如其他人所建議的那樣

這不起作用的原因是XDocument是一個潛在的非常復雜的對象。 ASP.NET MVC 框架沒有直接的方法將文檔序列化為適合 URL 的內容,然后將模型綁定從 URL 值返回到XDocument操作參數。

通常,將文檔傳遞給客戶端以便客戶端在下一次請求時將其傳遞回服務器是一個非常脆弱的過程:它需要各種序列化和反序列化,並且各種事情都可能出錯。 如果文檔很大,也可能會大量浪費帶寬,並可能嚴重影響應用程序的性能。

相反,您想要做的是將文檔保留在服務器上並將標識符傳遞回客戶端。 然后客戶端將標識符與下一個請求一起傳遞,服務器使用此標識符檢索文檔。

存儲數據以供下次請求檢索

那么,現在的問題就變成了,服務器在此期間將文檔存儲在哪里? 好吧,這由您決定,最佳選擇將取決於您的特定情況。 如果需要長期使用此文檔,您可能希望將其存儲在磁盤或數據庫中。 如果它只包含瞬態信息,將它保存在 web 服務器的內存中,在 ASP.NET 緩存或Session (或TempData ,最終與Session或多或少相同)可能是正確的解決方案。 無論哪種方式,您都可以將文檔存儲在一個密鑰下,以便您以后檢索該文檔:

int documentId = _myDocumentRepository.Save(updatedResultsDocument);

然后將該密鑰返回給客戶端:

return RedirectToAction("UpdateConfirmation", "ApplicationPoolController ", new { id = documentId });

當您想要檢索文檔時,您只需根據鍵來獲取它:

 public ActionResult UpdateConfirmation(int id)
 {
      XDocument doc = _myDocumentRepository.GetById(id);

      ConfirmationModel model = new ConfirmationModel(doc);

      return View(model);
 }

您是否嘗試過使用ASP.NET MVC TempData

ASP.NET MVC TempData 字典用於在控制器操作之間共享數據。 TempData 的值一直存在,直到它被讀取或直到當前用戶的會話超時。 當需要超出單個請求的值時,將 TempData 中的數據持久化在重定向等場景中非常有用。

代碼將是這樣的:

[HttpPost]
public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
{
    XDocument updatedResultsDocument = myService.UpdateApplicationPools();
    TempData["doc"] = updatedResultsDocument;
    return RedirectToAction("UpdateConfirmation");
}

在 ApplicationPoolController 中:

public ActionResult UpdateConfirmation()
{
    if (TempData["doc"] != null)
    {
        XDocument updatedResultsDocument = (XDocument) TempData["doc"];
            ...
        return View();
    }
}

我個人喜歡使用 TempData,但我更喜歡傳遞強類型對象,如在 ASP.Net-MVC 中的控制器之間傳遞信息中所述

您應該始終找到一種方法使其明確且符合預期。

我更喜歡使用它而不是TempData

public class Home1Controller : Controller 
{
    [HttpPost]
    public ActionResult CheckBox(string date)
    {
        return RedirectToAction("ActionName", "Home2", new { Date =date });
    }
}

另一個controller Action

public class Home2Controller : Controller 
{
    [HttpPost]
    Public ActionResult ActionName(string Date)
    {
       // do whatever with Date
       return View();
    }
}

為時已晚,但我希望對未來的任何人有所幫助

如果您需要將數據從一個控制器傳遞到另一個控制器,您必須通過路由值傳遞數據。因為兩者都是不同的請求。如果您將數據從一個頁面發送到另一個頁面,那么您必須使用用戶查詢字符串(與路由值相同)。

但你可以做一招:

在您的調用操作中,將被調用操作作為簡單方法調用:

public class ServerController : Controller
{
 [HttpPost]
 public ActionResult ApplicationPoolsUpdate(ServiceViewModel viewModel)
 {
      XDocument updatedResultsDocument = myService.UpdateApplicationPools();
      ApplicationPoolController pool=new ApplicationPoolController(); //make an object of ApplicationPoolController class.

      return pool.UpdateConfirmation(updatedResultsDocument); // call the ActionMethod you want as a simple method and pass the model as an argument.
      // Redirect to ApplicationPool controller and pass
      // updatedResultsDocument to be used in UpdateConfirmation action method
 }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM