2012-04-02 218 views
2

我有一個形式,它看起來有點像這樣的網頁:多種形式

@using (Html.BeginForm("MyAction", "Controller", FormMethod.Post)) 
{ 
    // html input fields here 
    // ... 
    // [SUBMIT] 
} 

當提交按鈕,用戶按下,那麼下面的函數調用:

public ActionResult MyAction (string id) 
{ 
    // default action 
} 

[HttpPost] 
public ActionResult MyAction (MyModel model) 
{ 
    // called when a form is submitted 
} 

現在我的問題是,我不得不添加另一種形式。但我怎麼知道哪個表單被提交?因爲兩者現在都會在第二個(HttpPost)方法中結束...

什麼是分離兩種表單操作的好方法?請注意,提交表格時,我必須保持在同一頁面上。我無法將自己重定向到其他頁面/控制器。

回答

5

如果我正確理解你的問題,你將有一個頁面,其中有兩種形式。 作爲第一種方法,我會將每個表單發佈到同一控制器的不同動作。

第一

@using (Html.BeginForm("MyAction", "Controller", FormMethod.Post)) 

第二

@using (Html.BeginForm("MyAction2", "Controller", FormMethod.Post)) 

,然後,在你的兩個動作一點點重構跟隨DRY principle

如果您需要兩種表單來發布相同的動作,那麼我會提供一個隱藏的輸入讓我知道被調用的人。

+0

我也想過,但是這兩個操作都會有相同的代碼,比如從數據庫中獲取數據。你在談論DRY,這是否意味着在我的控制器中創建一個私有方法是完全可以的,這兩個Actions都可以使用? – Vivendi 2012-04-02 09:41:14

+1

是的,爲什麼不呢?您可以在許多地方調用函數來重構代碼。你也可以考慮創建一個擴展方法,但我不知道你在代碼中做了什麼。 – Iridio 2012-04-02 09:44:09

1

如果你想查看沒有重定向的數據,我建議你使用JQuery Ajax。您可以使用下面的示例

$(document).ready(function(){ 

    $('#IdOfButton').click(function(){ 

     $.ajax({ 
     url: '/Controller/MyAction', 
     type: 'POST', 
     data: { 
      PropertyInModel : ValueFromView 
      //for values you need to pass from view to controller 
     }, 
     contentType: 'application/json; charset=utf-8', 
     success: function (data) { 
      alert(data.success); 
     }, 
     error: function() { 
      alert("error"); 
     } 
    }); 

    }); 
}); 

你的行動看起來像這樣

[HttpPost] 
    public ActionResult MyAction (MyModel model) 
    { 
     // called when a form is submitted 
     return Json(new { success = true }); 
    } 
+0

當您需要返回模型上的錯誤時,您會做什麼?例如,如果(ModelState.IsValid)的計算結果爲false,並且只想將模型返回到視圖並使ValidationSummary顯示模型錯誤。 – 2012-04-02 12:36:39

3

如果你有一個網頁/視圖多種形式,想張貼到不同的操作添加姓名HTML歸因於beginform方法:

@using (Html.BeginForm("action1", "contollerName", new { @name = "form1" })) 
{ 
    ...add view code 
} 

@using (Html.BeginForm("action2", "contollerName", new { @name = "form2" })) 
{ 
    ...add view code 
} 

每種形式具有不同的名稱將允許MVC容易確定發佈一個行動,而不是依靠不同的形式收集值來解決這個問題。