리디렉션 전에 Viewbag 설정


122

설정할 수 있습니까? ViewBag리디렉션을 호출하기 전에 있습니까?

나는 다음과 같은 것을 원한다.

@ViewBag.Message="MyMessage";
RedirectToAction("MyAction");

답변:


242

리디렉션을 사용할 때는를 사용하지 않아야 ViewBag하지만TempData

public ActionResult Action1 () {
 TempData["shortMessage"] = "MyMessage";
 return RedirectToAction("Action2");
}

public ActionResult Action2 () {
 //now I can populate my ViewBag (if I want to) with the TempData["shortMessage"] content
  ViewBag.Message = TempData["shortMessage"].ToString();
  return View();
}

1
보기에 없는데 왜 @ViewBag가 있습니까?
apkisbossin

6
나는 그것을 사용하고 있고 어떤 이유로 TempData가 비어있을 때 작은 문제에 직면했기 때문에 대답을 완성하고 싶습니다 (제 경우에는 변환이 이루어질 때만 메시지가 있습니다). 그래서 오류를 피하기 위해 if (TempData [ "Message"]! = null) 테스트를해야했습니다.
Patrick

1
리디렉션이 다른 컨트롤러 인 경우 어떻게됩니까? 다른 컨트롤러의 작업 ViewBag에서 TempData 및 Session은 모두 비어 있습니다!
Andrew

1
@Andrew 잘, TempData는 특정 컨트롤러와 관련이 없습니다. 둘 이상의 리디렉션을 수행하고 TempData를 잃을 수도 있습니다. 당신은 ... 일부 코드와 새로운 질문에 링크 할 수 있습니다
라파엘 Althaus에게

필터 속성의 OnAuthorize metiod에서 설정하려고했지만 아무것도 작동하지 않았으므로 결국 쿼리 문자열을 사용하여 데이터를 전달했습니다. 반대로 컨트롤러에서 TempData를 설정하면 나중에 필터 속성에서 읽어야 할 때 작동했습니다. 감사!
Andrew

13

이 상황에서 TempData를 사용할 수 있습니다. 다음 은 ViewBag, ViewData 및 TempData에 대한 몇 가지 설명입니다.


8

나는 이것을 좋아했다. 그리고 그것은 나를 위해 일하고있다 ... 여기 나는 암호를 변경하고 성공시 성공 메시지를 viewbag에 표시하도록 설정하고 싶습니다 ..

    public ActionResult ChangePass()
    {
        ChangePassword CP = new ChangePassword();
        if (TempData["status"] != null)
        {
            ViewBag.Status = "Success";
            TempData.Remove("status");
        }
        return View(CP);
    }

    [HttpPost]
    public ActionResult ChangePass(ChangePassword obj)
    {
        if (ModelState.IsValid)
        {
            int pid = Session.GetDataFromSession<int>("ssnPersonnelID");
            PersonnelMaster PM = db.PersonnelMasters.SingleOrDefault(x => x.PersonnelID == pid);

            PM.Password = obj.NewPassword;
            PM.Mdate = DateTime.Now;
            db.SaveChanges();

            TempData["status"] = "Success";
            return RedirectToAction("ChangePass");
        }

        return View(obj);
    }

3

여기에서 찍은

요약

ViewData 및 ViewBag 개체는 모델과 함께 제공되는 추가 데이터에 액세스하는 방법을 제공하지만 더 복잡한 데이터의 경우 ViewModel로 이동할 수 있습니다. 반면에 TempData는 HTTP 리디렉션에 대한 데이터 작업을 위해 특별히 설계되었으므로 TempData를 사용할 때는주의해야합니다.


-2

또는 대안으로 Session을 사용할 수 있습니다.

Session["message"] = "MyMessage";
RedirectToAction("MyAction");

그런 다음 필요할 때마다 전화를 겁니다.

최신 정보

또한 @James가 그의 의견에서 말한 것처럼 원하지 않는 정크 데이터 또는 오래된 값을 피하기 위해 사용 후 특정 세션의 값을 무효화하거나 지우는 것이 안전합니다.


4
나는 그것에 동의하지 않습니다. 이를 위해 세션을 사용하지 마십시오.
Mahmoodvcs 2014

2
대안입니다. 특정 상황에서 바람직합니다.
csharpforevermore

세션 변수는 여러 게시물 / 가져 오기간에 추적해야하는 사항에 유용합니다. 이와 같은 일회성 사용의 경우 삭제하는 것을 기억해야합니다. 그렇지 않으면 나중에 정크 데이터가되어 일부 화면에서 원하지 않는 것처럼 보이거나 컨텍스트에서 논리를 트리거 할 수도 있습니다.
James

@James 정확합니다.이 접근 방식을 사용해야하는 경우에 제가하는 일입니다. 사용 후 값을 무효화하거나 지우는 것은 이러한 경우에 필수입니다.
Jon P
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.