2011-02-10 44 views
4

是否可能有兩個輸入或按鈕控件在綁定到Html.BeginForm的同一個控制器中觸發兩個不同的動作?ASP.NET MVC在Html.BeginForm中使用兩個輸入

在以下示例中,我希望訂閱輸入在控制器上調用Subscribe操作。這很好。我想取消訂閱輸入來調用我的取消訂閱操作。我如何做到這一點? TIA。

<% using (Html.BeginForm("Subscribe", "NewsLetter")) 
    {%>  
     <div class="editor-field"> 
      <%= Html.TextBoxFor(model => model.EmailAdress) %> 
      <%= Html.ValidationMessageFor(
       model => model.EmailAdress) %>         
     </div>       
     <div > 
      <input type="submit" class="submit" value="Subscribe" /> 
      <input type="submit" class="submit" value="Unsubscribe" /> 
     </div>   
<% } %> 

更新

只是更多的情況下這個問題:

我NewsLetterController有兩個動作訂閱和退訂如下貼:

public class NewsLetterController : Controller 
    {  
     [HttpPost] 
     public ActionResult Subscribe(NewsletterSubscriber subscriber) 
     { 
      // do something 

     } 

     [HttpPost] 
     public ActionResult Unsubscribe(NewsletterSubscriber subscriber) 
     { 
      // do something 
     } 

我希望我可以從同一個Form元素調用每個動作,但這顯然是錯誤的。我如何仍然維護MVC模式,但如果可能的話避免腳本?發佈的HTML是在主頁面上呈現的部分視圖的一部分。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl 
            <AkwiMemorial.Models.NewsletterSubscriber>" %> 

    <h2><strong>Newsletter</strong></h2> 
    <legend>Enter your email</legend> 

    <% using (Html.BeginForm("Subscribe", "NewsLetter")) 
     {%>  
      <div class="editor-field"> 
       <%= Html.TextBoxFor(model => model.EmailAdress) %> 
       <%= Html.ValidationMessageFor(model => model.EmailAdress) %> 
      </div>       
      <div > 
      <input type="submit" class="submit" name="sub" 
        value="Subscribe" /> 
       <input type="submit" class="submit" name="unsub" 
        value="Unsubscribe" /> 
      </div>   
    <% } %> 
+0

如果您需要添加更多的信息,請編輯你的問題。 – 2011-02-10 16:26:45

回答

8

一個HTML form元素只有一個action。所以除非你的按鈕改變了JavaScript,否則每個表單只能獲得一個URI。你想讓你的網站只能使用JavaScript嗎?

另一種選擇是給按鈕的name,在這種情況下,你會得到value的形式發佈的一部分,例如:

<input type="submit" class="submit" name="newsletter" value="Subscribe" /> 
<input type="submit" class="submit" name="newsletter" value="Unsubscribe /> 

然後你就可以擁有它檢查值的單個動作如:

public ActionResult Subscribe(string newsletter) 
{ 
    if ("subscribe".Equals(newsletter, StringComparison.OrdinalIgnoreCase)) 
    { 
     //... 

因爲newsletter是在發佈形式的關鍵,MVC將結合其價值的行動的說法。

+0

NewsLetterController中的「訂閱」方法如下所示:public ActionResult訂閱(NewsletterSubscriber訂閱者)。 根據您的建議,我如何才能獲得通過NewsletterSubscriber實例傳遞到此方法的按鈕名稱? – 2011-02-10 13:51:14

+0

`NewsletterSubscriber`類型需要具有與提交`input`的`name`屬性具有相同名稱的屬性。 – 2011-02-10 14:29:02

0

你可以做到這一點使用jQuery:

function Subscribe() 
{ 
    $.post(urlToSubscribeAction, $('#formId').serialize(), function() {// Do something after post}); 
    return false; 
} 

function UnSubscribe() 
{ 
    $.post(urlToUnsubscribe, $('#formId').serialize(), function() { // Do something after post}); 
    return false; 
} 

添加onclick處理程序的提交按鈕將調用JavaScript函數,然後做形式的郵寄到正確的URL。確保將FormId替換爲表單元素的corect Id。

<input type="submit" class="submit" value="Subscribe" onclick="Subscribe()" /> 
<input type="submit" class="submit" value="Unsubscribe" onclick="Unsubscribe()" /> 
+0

感謝您的建議。我不想在這個階段介紹jquery,只要我能夠擺脫它。此外,您的建議將需要我的頁面上有更多的代碼,而不是控制器。, – 2011-02-10 13:49:26

1

或者使用RedirectToAction

<%using(Html.BeginForm("RedirectingAction", "NewsLetter")){ %> 

    <input type="submit" class="submit" name="newsletter" value="Subscribe" /> 
    <input type="submit" class="submit" name="newsletter" value="Unsubscribe" /> 
    <%} %> 

,並在控制器:

public ActionResult RedirectingAction() 
    { 
     TempData["Form"] = Request.Form; 
     return RedirectToAction(Request.Form["newsletter"].ToString()); 
    } 
    public ActionResult Subscribe() 
    { 
     // Do stuff 
     return View(); 
    } 
    public ActionResult Unsubscribe() 
    { 
     //Do something else 
     return View(); 
    } 
相關問題