2014-04-03 58 views
0

我有一個Save方法,它有一些額外的服務器端驗證。如果失敗,我想在瀏覽器中維護「/ Edit/id」網址,以便刷新會保留在頁面上。 (如果在這種情況下是不可能的,請讓我知道。)如何在保存操作中保留編輯URL和現有數據

這裏是如何我試圖做現在這個正確的簡略視圖:

比URL,最大的問題
[HttpPost] 
public ActionResult Save(UserEditModel model) { 
    try { 
     repository.SaveUser(model.CopyTo()); 
    } 
    catch (InvalidOperationException ex) { 
     // Doing this to just display it at the top of the page as it is not property-specific. 
     TempData["UserError"] = ex.Message; 
     // Doing this to maintain the "Edit/id" URL. 
     return RedirectToAction("Edit", "Users", new { id = model.Id }); 
    } 

    // Want to keep the URL on the Index page as "Users", instead of "Users/Save". 
    return RedirectToAction("Index", "Users", new { page = model.Page }); 
} 

其他我遇到這種情況是因爲我正在重定向,所以我也失去了用戶在失敗的保存嘗試中輸入的所有數據。

我已經嘗試在編輯操作中添加一個可選的UserEditModel參數,默認爲null,但當從頁面上的鏈接導航到編輯操作時(不是從保存操作重定向),可選的模型參數被默認到new UserEditModel()而不是默認值null我給它在參數列表中。

回答

1

您可以使用一個TempData把你的數據在你的控制器。並且在你看來,如果它不爲null,則提供一些條件,然後從數據包中提取數據並放回原處。

在你的控制器:

[HttpPost] 
public ActionResult Save(UserEditModel model) { 
try { 
    TempData["Field1"] = model.Field1; 
    TempData["Field2"] = model.Field2; 
    ..... 
    repository.SaveUser(model.CopyTo()); 
} 
catch (InvalidOperationException ex) { 
    // Doing this to just display it at the top of the page as it is not property-specific. 
    TempData["UserError"] = ex.Message; 
    // Doing this to maintain the "Edit/id" URL. 
    return RedirectToAction("Edit", "Users", new { id = model.Id }); 
} 

// Want to keep the URL on the Index page as "Users", instead of "Users/Save". 
return RedirectToAction("Index", "Users", new { page = model.Page });} 

然後在您的視圖:

@{if(TempData["Field1"] != null) 
    //Assign your textbox here 

    else 
    //your first code to display the textBox 

    } 

我希望這會幫助你。

+1

你是不是指'TempData',因爲重定向,ViewBag和ViewData被清除,是正確的? – krillgar

+0

這是一個體面的想法,我可以看到使用。但是,我會改進它,而不是將屬性單獨存儲在TempData中,存儲整個Model對象。然後,在頁面頂部的Razor塊中,檢查該對象是否存在於TempData中,如果存在,請在模型上運行Copy方法以覆蓋所有屬性。這樣你不需要每個文本框周圍的'if/else'。 – krillgar

+0

是的。如你所說,效果更好。 –

0

你應該有一個[HttpGet]動作和return View(model);將節省您的數據和URL

public ActionResult Save(int id) 
{ 
    return View(repository.GetUserById(id)); 
} 


[HttpPost] 
public ActionResult Save(UserEditModel model) { 
    try { 
     repository.SaveUser(model.CopyTo()); 
     return RedirectToAction("Index", "Users", new { page = model.Page }); 
    } 
    catch (InvalidOperationException ex) { 
     TempData["UserError"] = ex.Message; 
     return View(model); 
    } 
} 
+0

但是,錯誤發生後,Url會顯示爲'Users/Save',對嗎? – krillgar

+0

這將是**用戶/保存/ 2 ** –

+0

對。這就是把整個事情踢開的問題,導致我做一個'Redirect'而不是'返回Edit()'。另外,有一個Save.cshtml,我不得不復制另一個視圖中的所有代碼。 – krillgar

相關問題