2012-06-12 30 views
7

所以我有一個ViewBag.Something和這個數據是隨機產生的。在我看來,我將其設置爲像@Html.LabelFor(m => m.Something, (string)ViewBag.Something)這樣的標籤。這可以很好地工作,但是當我提交表單時可能會出現錯誤,如果出現錯誤,我需要這個標籤保持不變,我不再需要動態/隨機數據,所以我不會調用生成的控制器方法這個ViewBag。有沒有辦法在我的控制器中沒有一些私有變量的情況下保留這個值? MVC/Razor有一些不錯的方法嗎?在表單發佈後如何保存ViewBag數據?

回答

1

在得到的時候,建立一個模型,動態地設置它,當return view()正在執行時,請做return view(model)。然後在視圖中,設置一個可以繼續傳遞所需值的隱藏字段。我選擇了這條路線,因爲我不必擔心任何服務器代碼使這項工作在一個帖子上,我不必擔心任何會議。

+0

這有安全問題。如果有人檢查代碼,他們將能夠得到甚至修改數據... 另外,如果它是一個對象呢? – Nick

12

選項1:

通過使用路由值 「ViewBag.Something」 的值傳遞給控制器​​:

@Html.ActionLink("ButtonText", "ActionName", new { Something = @ViewBag.Something }) 

選項2: 您可以使用TempData的

public ActionResult Index() 
{ 
var Something = "YOURVALUE"; 
TempData["Something"] = Something; 
....... 
} 


public ActionResult OtherAction() 
{ 
    var Something = TempData["Something "]; 
    ........... 
} 

通行動作方法

Action方法之間的狀態可能具有將數據傳遞給另一個動作,例如,如果當一個形式正被髮布時發生錯誤,或者,如果該方法必須重定向到附加方法,就像用戶被引導到登錄視圖然後回到原始操作方法時可能發生的那樣。

在調用控制器的RedirectToAction方法來調用下一個操作之前,操作方法可以將數據存儲在控制器的TempDataDictionary對象中。 TempData屬性值存儲在會話狀態中。在設置了TempDataDictionary值之後調用的任何操作方法都可以從該對象獲取值,然後處理或顯示它們。 TempData的值會一直保持到讀取或直到會話超時。以這種方式持久化TempData可實現重定向等場景,因爲TempData中的值在單個請求之外是可用的。

+0

,所以我將存儲ViewBag.Something在TempData的,當我點擊提交,並如果出現問題,它可以使用?這可能會產生問題,因爲我的標籤是從ViewBag填充,我想現在我需要有某種類型的if? – Pittfall

+0

請參閱我的更新,以瞭解更多可供選擇的選項。 –

+0

感謝您的幫助,它看起來不錯,但我走在另一個方向,所以我不能接受你的答案 – Pittfall

-1

顯示在viewbag消息發佈(我的用戶此方法)

ActionResult SubmitUser(){ 

    ViewBag.Msg =TempData["Msg"]; 

    return view(); 
} 


[HtttpPost] 
ActionResult SubmitUser(){ 

TempData["Msg"] ="Submitted Successfully"]; 

    return view(); 
} 

後的值被髮送到get方法..