2011-02-10 20 views
4

Html.BeginFormにバインドされた同じコントローラ内で、2つの入力またはボタンコントロールで2つの異なるアクションがトリガされますか?ASP.NET MVC Html.BeginFormで2つの入力を使用

次の例では、Subscribe入力がコントローラの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 2つのアクションが登録と登録解除は下記掲載されています:この質問へ

はちょうどより多くのコンテキストが

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

     } 

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

私はことを期待していました同じフォーム要素から各アクションを呼び出すことができますが、これは明らかに偽です。可能であれば、私はどのように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

ちょうどあなたの質問を編集してください。 –

答えて

8

HTML form要素が一つだけactionを持っています。つまり、JavaScriptでJavaScriptのボタンを変更しない限り、各フォームはURIを1つだけ取得します。 JavaScriptが有効になっているだけでサイトが機能するようにしますか?

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

は、その後、あなたが値をチェックする単一のアクションを持つことができます。

別のオプションを使用すると、投稿フォームの一部としてvalueを得るでしょう。その場合には、ボタンname、例えばを与えることです例えば:newsletterがポストされたフォームでの鍵となりますので

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

は、MVCはアクションの引数に値をバインドします。

+0

NewsLetterControllerの "Subscribe"メソッドは次のようになります:public ActionResult Subscribe(NewsletterSubscriber subscriber)。 あなたのお勧めに基づいて、NewsletterSubscriberインスタンスでこのメソッドに渡されるボタン名を取得するにはどうすればよいですか? –

+0

'NewsletterSubscriber'タイプは、submit' input'の 'name'属性と同じ名前のプロパティを持つ必要があります。 –

+0

優秀、ありがとうございます。 –

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; 
} 

は、JavaScriptの関数を呼び出した後、正しいURLにフォームのポストを行います送信ボタンにonclickのハンドラを追加します。 formIdをフォーム要素のcorect Idに置き換えてください。

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

ありがとうございます。私がそれを取り除くことができれば、この段階でjqueryを導入したくありません。また、コントローラの代わりに私のページに多くのコードが必要です。 –

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(); 
    } 
+0

しないでください。 HTTP GETでサーバの状態を変更する公開アクションを作成しました。セッションがリダイレクト中に期限切れになると、それらは壊れます。彼が選んだ解決方法はどれでも、彼は自分の質問のコードのようにPOSTと単一の要求に固執するべきです。 –

+0

が合意しました。今質問は、私の理解からの既存の購読中止アクション、つまりRedirectToActionを述べていました。あなたのバインドとすべては、RedirectingActionで引き続き発生する可能性があります。 – Burcephal

+0

この回答をお寄せいただきありがとうございますが、Craigはこのアプローチに注意する必要があると言います。私はjavascriptを避ける実用的なソリューションをまだ受け取っていないので、他の人が何を言わなければならないかを見ていきます。 –

関連する問題