2013-10-10 21 views
6

直截了當的問題,似乎無法讓我的viewBag值顯示在用戶在完成表單後指向的視圖中。爲什麼viewbag的價值不再回到視圖?

請advise..thanks

我的索引的ActionResult簡單的回報模型數據..

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View(model); 
} 

我獲取編輯」的ActionResult,只需使用相同的模型數據作爲指標。

我的帖子「編輯」ActionResult,將新值(如果有的話)分配給模型並重定向到索引頁面,但索引頁面不顯示ViewBag值

[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return RedirectToAction("Index");  
    } 
    return View(model); 
} 

在我的索引視圖...

@if(@ViewBag.Message != null) 
{ 
    <div> 
     <button type="button">@ViewBag.Message</button> 
    </div> 
} 

回答

23

ViewBag只住當前請求。在你的情況下,你正在重定向,所以你可能已經存儲在ViewBag中的所有東西都會隨着當前請求而死。只有在渲染視圖時才使用ViewBag,而不是在打算重定向的情況下。

使用TempData代替:

TempData["Message"] = "Profile Updated Successfully"; 
return RedirectToAction("Index"); 

,然後在您的視圖:

@if (TempData["Message"] != null) 
{ 
    <div> 
     <button type="button">@TempData["Message"]</button> 
    </div> 
} 

在幕後,TempData的將使用會話但一旦你從中讀取它就會自動退出的紀錄。所以它基本上用於短生存,單重定向持久性存儲。

另外,如果你不想依賴會話(這可能是我會做的),你可以將它作爲查詢字符串參數傳遞。

2

RedirectToAction會導致HTTP 302響應,這會使客戶端再次調用服務器並請求新頁面。

您應該返回一個視圖而不是重定向。

+0

嗯,實際上,最好的做法是在成功的POST後重定向 - 重定向後事後模式。僅在用戶需要修復並重新提交時存在一些錯誤時才返回視圖。 –

+0

用戶問作爲直接的問題,我直接回答了爲什麼價值沒有被顯示。 – Natan

+0

我不知道,將它存儲在會話中的缺點是,如果要擴展,它會帶來麻煩。我會贊成直接返回一個視圖,而不是將它存儲在會話中(您應該始終保持謹慎) – Kristof

2

RedirectToAction(msdn)指示您的瀏覽器發出新的請求。
因此,您的服務器將被再次調用,但它將是一個空白viewbag和所有的新請求
你可以通過調用索引方法做一種內部重定向,這樣viewbag仍然會有它的數據。

編輯:您還必須修改您的索引方法,否則您的視圖(模型)行將嘗試呈現編輯。下面

public ActionResult Index() 
{ 
    var source = _repository.GetByUserID(_applicationUser.ID); 
    var model = new RefModel 
    { 
     test1 = source.test1, 
    }; 
    return View("Index",model); 
} 


[HttpPost] 
public ActionResult Edit(RefModell model) 
{ 
    if (ModelState.IsValid) 
    { 
     var source = _repository.GetByUserID(_applicationUser.ID); 
     if (source == null) return View(model); 

     source.test1 = model.test1; 
     _uow.SaveChanges(); 

     @ViewBag.Message = "Profile Updated Successfully"; 
     return Index();  
    } 
    return View(model); 
} 
+0

圖例,工作完美,謝謝 – mkell

+0

只是爲了進一步扭轉這個問題......如果我回來的視圖是一個選項卡視圖,我唯一的方式來重定向是通過..返回RedirectPermanent(「〜〜 /RefTarget/Index/#users");.......#users是三個選項卡之一......然後,如何執行viewBag消息操作? – mkell

+0

您正在重做一次重定向。我將選定的選項卡設置在視圖模型或視圖包中,並在視圖中檢查此值以在呈現時選擇正確的選項卡。 – Kristof

0


全部代碼,你可以試試這個方法也

控制器

public ActionResult Test() 
    { 
ViewBag.controllerValue= "testvalue"; 
.................. 
    } 

查看 - 定義剃刀頁面頂部 @{string testvalue= (string)ViewBag.controllerValue;}

$(function() { 
     var val= '@testvalue'; 
}); 
相關問題