서로 다른 컨트롤러 작업 방법 간에 데이터 전달
는 중용사를 합니다.ASP.NET MVC 4한 컨트롤러에서 다른 컨트롤러로 데이터를 전달하려고 합니다.이해가 안 돼요.이것이 가능한지 잘 모르겠습니다.
다음은 데이터를 전달할 소스 작업 방법입니다.
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
}
}
이 컨트롤러에서 이 작업 방법으로 전달해야 합니다.
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의 작동 방식을 요약해 보겠습니다.
- HTTP 요청이 수신되면 경로 집합과 일치합니다.경로가 요청과 일치하면 해당 경로에 해당하는 컨트롤러 작업이 호출됩니다.
- 작업 메서드를 호출하기 전에 ASP.NET MVC는 모델 바인딩을 수행합니다.모델 바인딩은 기본적으로 텍스트인 HTTP 요청의 내용을 작업 방법의 강력한 형식의 인수에 매핑하는 프로세스입니다.
또한 리디렉션이 무엇인지 알려줍니다.
은 웹 입니다. HTTP 리디션은렉트에언에로보낼으응라,언가다트른다니지 URL합시요찾록.은 "URL"에되어 있습니다.Location웹 서버가 클라이언트에 반환하는 헤더입니다.ASPASP.NET MVC를 합니다.RedirectResult소송에서
데이터 전달
및 정수와 의 쿼리 매개 할 수 .Location표제의만약 당신이 이런 것을 사용한다면 이런 일이 일어날 것입니다.
return RedirectToAction("ActionName", "Controller", new { arg = updatedResultsDocument });
다른 사람들이 시사하는 바와 같이
이것이 효과가 없을 것이라는 이유는XDocument잠재적으로 매우 복잡한 개체입니다.ASP MVC 에서 ASP.NET MVC로 .XDocument작업 매개 변수.
일반적으로 다음 요청 시 클라이언트가 서버에 문서를 다시 전달하기 위해 클라이언트에 문서를 전달하는 것은 매우 취약한 절차입니다. 모든 종류의 직렬화 및 역직렬화가 필요하고 모든 종류의 작업이 잘못될 수 있습니다.문서가 크면 대역폭이 상당히 낭비될 수 있으며 응용프로그램 성능에 심각한 영향을 미칠 수 있습니다.
대신, 문서를 서버에 보관하고 식별자를 클라이언트에 다시 전달합니다.그런 다음 클라이언트는 다음 요청과 함께 식별자를 전달하고 서버는 이 식별자를 사용하여 문서를 검색합니다.
다음 요청 시 검색할 데이터 저장
이제 문제는 서버가 그 동안 문서를 어디에 저장하느냐는 것입니다.글쎄요, 그건 당신이 결정해야 할 일이고 최선의 선택은 당신의 특정 시나리오에 달려 있습니다.이 문서를 장기적으로 사용할 수 있어야 하는 경우 디스크 또는 데이터베이스에 저장할 수 있습니다.서버의 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");
}
Application Pool 컨트롤러에서 다음을 수행합니다.
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
}
}
언급URL : https://stackoverflow.com/questions/15385442/passing-data-between-different-controller-action-methods
'programing' 카테고리의 다른 글
| Python - TypeError: 'int64' 유형의 개체는 JSON 직렬화할 수 없습니다. (0) | 2023.06.15 |
|---|---|
| WAS(Windows Process Activation Service)에서 응용 프로그램 풀을 제공하기 위한 작업자 프로세스를 시작할 때 오류가 발생했습니다. (0) | 2023.06.15 |
| 객체가 없을 때 Excel용 VBA가 "Object variable or with block variable not set"을 던집니다. (0) | 2023.06.15 |
| Django 1.11을 Mariadb Galera 클러스터에 연결합니다. (0) | 2023.06.15 |
| Oracle 11g에서 상위 5개 또는 'N'개 행을 선택하는 방법 (0) | 2023.06.10 |