2010-11-24 18 views
12

我想知道在asp.net mvc 3 RC中提交表單時如何執行多個表單操作。如何最好地實現Save |保存並關閉|在ASP.NET MVC 3中取消表單操作RC

如果我正在編輯用戶,例如我想要一個帶有以下按鈕的操作欄;

「Save」| 「保存並關閉」| 「取消」

保存 - 提交表單並保存,返回到編輯屏幕。可以輕鬆實現爲標準輸入/提交按鈕。沒什麼特別的。

這個控制器代碼可能看起來像

public ActionResult Edit(UserViewModel model) 
{ 
    ... 
    return RedirectToAction("Edit", model.Id"); 
} 

取消 - 剛剛返回到前一個畫面。我正在考慮爲此使用錨標籤。

<a href="@Request.UrlReferrer" class="button">Cancel</a> 

但我難倒就如何落實「保存並關閉」當你需要提交相同的表格數據。我想知道有一個可爲空的關閉參數也許?

public ActionResult Edit(UserViewModel model, bool? close) 
{ 
    ... 
    return close.GetValueOrDefault(false) ? RedirectToAction("Index", model.Id" : RedirectToAction("Edit", model.Id"); 
} 

但是,在這種情況下,我如何提交這個額外的參數?

如果可能,我希望有一個單一的表單操作來處理提交,如上面的模型。

我也很感興趣,如果有人提出了一個很好的用戶交互模型圍繞這個想法。

解決方案

最後我用下面奧馬爾的建議,但不是在傳遞一個字符串,我參加了一個枚舉所以我沒有做字符串檢查在我所有的控制器。

public ActionResult Edit(UserViewModel model, FormAction actionType) 
{ 
    // pre-check 
    if (actionType == FormAction.Cancel) 
    // just return user to previous view and don't save. 

    // Save code 

    if (actionType == FormAction.Save) 
    return ... 
    else if (actionType == FormAction.SaveAndClose) 
    .... 
} 

因爲我想在<input>按鈕友好「保存並關閉」文字,但想用一個枚舉我實現了FormAction自定義模型綁定器是做了解析。

我沒有使用<button>標籤,因爲主題已爲<input>標籤。

回答

18

您可以在具有相同name屬性但不同value屬性的表單中具有多個提交按鈕。點擊哪個按鈕,關聯的value將被髮布到服務器。

你可以使用一個簡單的鏈接Cancel,但我會將它作爲一個按鈕。

<input type="submit" name="actionType" value="Save" /> 
<input type="submit" name="actionType" value="Save and Close" /> 
<input type="submit" name="actionType" value="Cancel" /> 

並在您的操作中,測試值。

public ActionResult Edit(string actionType) 
{ 
    if(actionType == "Save") 
    { 
     // Save action 
    } 
    else if (actionType == "Save and Close") 
    { 
     // Save and quit action 
    } 
    else 
    { 
     // Cancel action 
    } 
} 

如果你不喜歡在value屬性長文本,你可以使用標準的HTML標籤<button>它可以讓你定義一個單獨的值和單獨的文本。

+0

http://stackoverflow.com/questions/2423041/using-two- submit-buttons-inside-single-form/2426152#2426152 – takepara 2010-11-24 15:38:34

+0

謝謝奧馬爾。那正是我想要的。乾杯! – 2010-11-24 23:15:21

5

@Omar的建議非常棒。這裏是我如何讓這個更通用一點,當我要求確認時,提示用戶刪除一個對象。 注意!在HttpPost中我再次拉對象而不是使用傳遞給方法的項。您可以通過讓視圖包含所有屬性來減少數據庫調用,以便填充「項目」。

這裏的視圖模型

public class DeleteViewModel<T> { 
    public string ActionType { get; set; } 
    public T Item { get; set; } 
} 

控制器

public ActionResult Delete(int id) { 
     DeleteViewModel<Category> model = new DeleteViewModel<Category>() { 
      Item = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == id) 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Delete(DeleteViewModel<Category> model) { 
     if (model.ActionType == "Cancel") 
      return RedirectToAction("Index"); 
     else if (model.ActionType == "Delete") { 
      var cat = categoryRepository.Categories.FirstOrDefault(x => x.CategoryID == model.Item.CategoryID); 
      categoryRepository.Delete(cat); 
      return RedirectToAction("Index"); 
     }   
     //Unknown Action 
     return RedirectToAction("Index"); 
    } 

查看

<div class="actions"> 
     <div class="actions-left"><input type="submit" value="Cancel" name="ActionType"/></div> 
     <div class="actions-right"><input type="submit" value="Delete" name="ActionType" /></div> 
    </div>