2011-04-11 29 views
11

MVC新手問題;我被打轉轉,而不是閱讀手冊學習... :)MVC:點擊「提交」按鈕時會調用哪些代碼?

我看到,當我創建一個「編輯」查看自動生成的視圖包括「提交」按鈕:

<input type="submit" value="Save" /> 

但是在幕後調用哪些代碼可以保存?具體來說,這個視圖下面的模型在我想調用的代碼中有它自己的奇特保存邏輯。我如何獲得視圖來調用我的代碼,而不是在幕後無形地調用任何標準代碼?

+2

閱讀手冊將waaaay更快:) nerddinner教程是很好讓你自己去與mvc。 – raklos 2011-04-11 13:39:33

回答

5

它會調用表單動作在控制器上指向的任何公共操作方法。然後您可以調用保存視圖模型。

public virtual ActionResult Save(MyViewModel model) { 
     model.Save();    

     --- more code to do stuff here 
    } 

設置你的表單動作MyController/Save

您還可以使用using (Html.BeginForm...在代碼的形式指向一個特定的操作方法特定的控制器上。

3

它調用在表單元素的動作部分中定義的操作的方法 例如:

<form action="/Account/LogOn" id="loginForm" method="post"> 

在賬戶控制器的登錄動作將在這種形式被調用

0

所述的ViewPage具有BeginForm方法using (Html.BeginForm()在頂部將呈現FormTag。此方法有一個重載,它採用ActionName和控制器名稱。所以你可以在控制器中指定必須調用的動作。

+1

不正確,它會調用您當前正在查看的相同方法的發佈操作。 – Jimmy 2011-04-11 13:04:53

+0

@Jimmy:感謝您的糾正。如果沒有爲調用視圖的方法指定後置動作,將調用哪個動作? – Novice 2011-04-11 13:07:31

+0

如果您在默認情況下使用「登錄」操作,它將發佈到相同的操作,以便發佈到操作「登錄」,我相信它在創建表單時根據您當前的路線執行此操作 – Jimmy 2011-04-11 13:10:02

5

當您單擊提交按鈕時,請求轉到HTTp模塊,該模塊會將其指向相應的控制器操作。當從模板創建編輯視圖形式的郵政通訊地址是一樣的編輯形式,即如果你正在訪問的/ home /編輯你可以看到下面的HTML形式的開放標籤

<form method="post" action="/home/edit"> 

你可以有另一種行動方法只接受POST請求喜歡

[HttpPost] 
public ActionResult Edit(int id, ViewModel model) 
{ 
     //put your logic here handling submitted values 
} 

HttpPost屬性告訴它只會處理POST請求,而不是獲得了所請求用於渲染的形式

11

不是按鈕那德罰款會發生什麼,但形式本身。提交類型(每個表單一個)的按鈕只是觸發表單提交,由表單本身處理。

某個表單的行爲 - 例如:

<form name="input" action="users/save" method="post"> 
    <!-- Form content goes here --> 
    <input type="submit" value="Submit" /> 
</form> 

行動是一個URL會發生什麼是瀏覽器收集的形式(<input...>)所有字段的值,並將其發佈到指定的網址。

在ASP.NET中,MVC表單通常使用Html幫助器來定義,因此構建表單操作的URL被委託給ASP.NET MVC。對於上面的例子:

<% using(Html.BeginForm("Save", "Users")) %> 
<% { %> 
    <!-- Form content goes here --> 
    <input type="submit" value="Save" /> 
<% } %> 

在這種情況下將創建一個URL /users/save和形式將發佈到該網址。這將觸發ASP.NET路由,它將處理URL並將其分解爲塊,以便它知道它必須調用「用戶」控制器類上的「保存」操作方法。然後它將讀取所有傳入的字段名稱 - 值對,並嘗試將它們映射到方法參數名稱(如果有的話)。

+0

如果Html.BeginForm()沒有參數會怎麼樣?什麼是默認行爲?當前的控制器和索引? – KirstieBallance 2017-01-03 22:53:32

+0

是的。不帶參數的BeginForm將HTTP POST發送到當前URL。請參閱:http://stackoverflow.com/a/16744311/381082 – DeveloperDan 2017-01-26 16:54:33