2015-04-22 45 views
0

我正在使用C#和MVC處理Web應用程序項目,它將採用表單中的兩個URL並使用它們來創建我創建的名爲「ImageSwap」的類的實例。這個模型有一些數據(執行交換的人的用戶名;兩個變量保存要交換的兩個圖像的URL;兩個變量保存這些文件的實際名稱,而沒有剩餘的URL信息;以及兩個表示檢查這些文件的文件位置的數組)。現在,我有這樣初始索引視圖創建類的實例並將其傳遞給中放置了通過表格的信息,通過POST提交的,像這樣相同的看法:在MVC中的視圖之間傳遞數據

public ActionResult Index() 
{ 
Ops.Operations.Models.ImageSwapModel newImageSwap = new Models.ImageSwapModel(); 
return View(newImageSwap); 
} 

[HttpPost] 
    public ActionResult Index(ImageSwapModel imageSwap) 
    { 
     var oldFileFound = false; 
     var newFileFound = false; 

     if (ModelState.IsValid) 
     { 
     //Perform data manipulation and set needed values 
     } 
    } 

然後它對數據執行一些功能,比如解析出URL末尾的文件名,以及一個目錄號(這是該文件名的第一部分,即目錄#_fileName.jpg)。所有這些工作正常。

我的問題是,我想通過這個模型傳遞給另一個視圖,一旦它的所有字段中有數據填充了這個初始的ActionResult,這樣我就可以擁有一個驗證視圖,這將允許用戶預覽兩個並排文件,以便他們可以確保他們交換適當的圖像。然後,他們應該能夠擊中另一個提交按鈕,這將啓動實際移動/替換圖像並被帶到頁面確認。

有沒有辦法將數據從這個控制器傳遞到不同的視圖?我的困惑產生了,因爲我無法用相同的輸入創建索引的ActionResult的另一個版本,但我不想在沒有預覽和提示的情況下實際交換圖像。我是否應該重新編寫索引視圖,以便它利用部分視圖來完成此操作?通過多個步驟和視圖持續保存數據的最簡單方法是什麼?

+0

你可以使用會話,數據庫,查詢字符串參數在任何圖層之間傳遞數據。 – semirturgay

+0

經過簡短的研究,看起來好像會話是最合理的方式。由於存儲在類中的許多信息很容易從其他變量中派生出來,所以我不打算在數據庫中將所有信息都放入數據庫中。查詢字符串參數需要在URL中傳遞太多數據。這些假設是否正確?如你所說, – ianodork

+0

會議將是最適合你的情況... – semirturgay

回答

3

什麼是必須通過多個步驟 和視圖中的數據持久化最簡單的方法你一個索引操作返回不同的看法?

你的問題聽起來像是你想要實現你可以輕鬆完成的任務。會話對象允許您在請求之間保持數據,只需將它添加到HttpContext上的Session對象上,該對象位於您的控制器擴展的基類內,如下所示:

(請注意Serializable屬性。被序列化到會話對象中)。

[Serializable] 
public class ImageSwapModel { 
    // Your class's properties 
} 

然後在你的控制器,你可以做到以下幾點:

[HttpPost] 
public ActionResult Index(ImageSwapModel imageSwap) 
{ 
    var oldFileFound = false; 
    var newFileFound = false; 

    if (ModelState.IsValid) 
    { 
     this.HttpContext.Session["ImageSwap"] = imageSwap; 
    } 
} 

當你要檢索的模型,你可以從會話抓住它,像這樣:

var imageSwap = (ImageSwapModel)this.HttpContext.Session["ImageSwap"]; 

服用它更進一步:

雖然上述將wor k很好,通常在代碼中直接引用HttpContext對象並不是一種好的做法,因爲它會產生不必要的耦合到易於避免的對象HttpContext。相反,您應該選擇通過依賴注入來注入會話對象的實例。 Here is a similar answer提供了關於如何做到這一點的基本思路。

1

您可以使用模型傳遞給他們如同

if(some condition) 
{ 
    Return View("ViewVersion1", MyModelVersion1); 
} 
else 
{ 
    Return View("ViewVersion2", MyModelVersion2); 
} 
相關問題