2016-05-05 77 views
0

我只是在這裏尋求一些'最佳實踐'的信息。 說我有一個控制器,例如c#控制器後過濾器

public ActionResult Create([Bind(Include="Title,Content")] Models.MyReport report) 

在窗體(視圖)我給給下面

<div class="btn-group" role="group"> 
    <button type="submit" name="action" value="Add" class="btn btn-primary">Create</button> 
    <button type="submit" name="action" value="Cancel" class="btn btn-default">Cancel</button> 
</div> 

所以,如果他們點擊創建它創建報表,取消取消它,並將其返回到列表屏幕(可以說)

是否有一個過濾器很像我應該使用的[HttpPost]或[ValidateAntiForgeryToken]。

或者我應該只使用控制器內的request.form[action]來從那裏計算出我的動作?

+4

爲什麼不只是讓'取消'重定向到您的索引頁的鏈接(如果您只是要扔掉它,沒有意義提交所有數據) –

回答

0

表單只能有一個提交輸入。改變你的取消按鈕是類型「按鈕」,甚至令,使之成爲鏈接:

<button type="submit" name="action" value="Add" class="btn btn-primary">Create</button> 
<a href="#" class="btn btn-default">Cancel</button> 

如果你的控制器動作與HttpPost裝飾屬性,那麼表單類型應該是崗位。

如果您有防僞屬性,則表單上的首次輸入應該是帶有令牌的隱藏輸入。有一個Html擴展爲你呈現。

+0

嗯,是的,我確實使用[HttpPost]和[ValidateAntiForgeryToken]這樣做有幫助。但是我擔心我沒有註冊每個表單參數的'單個按鈕'。我承認在這種情況下,取消可能是一個鏈接,但也許可以說我有另一個按鈕叫做'預覽',而內容有一些'bb'代碼。 (這可能是一個評論)現在我想發送這個對象回到剃刀前端,並讓它處理bbcode(使用助手)。這需要2個按鈕嗎?或者也許2個按鈕 - 一個發送給朋友1,另一個發給朋友2.然後呢? –

+1

不是「一個按鈕」,而是「一個提交輸入」(通常採用按鈕的形式)。其他按鈕可以添加而不需要提交輸入。在「發送給一位朋友的電子郵件」或「發送給兩位朋友的電子郵件」的情況下,這實質上是一條應提交(並進一步按照內部進行處理)的信息,而不是從表單驅動的實際行爲。 – jleach

+0

沒錯。您可以擁有儘可能多的按鈕,但只有一個應該是「提交」類型的輸入。 –

0

右所以答案是這樣

public ActionResult Create([Bind(Include="Title,Content")] Models.MyReport report,string action) 

然後控制器內你就可以做

if(action == 'create') { 
    //create action 
} 
else if(action="cancel") { 
//do something else 
} 

還有就是在這裏學到了更多的教訓,你可以添加儘可能多的「自定義」變量到控制器和c#/ mvc將映射get/post變量給它們。

您通過displayFor設置的名稱將具有一個名稱,c#/ mvc將在對象中使用 。