0

ページに1つのフォームがあり、2つの方法で送信できます。1つはアンカータグで、もう1つは送信ボタンです。どちらも動作が異なります。

それぞれに個別のアクションメソッドを割り当てるにはどうすればよいですか?ありがとう。

4

5 に答える 5

2

それは本当にアンカータグが何をするかに依存します-おそらくそれはjavascriptで送信をトリガーしていますか?

GETの代わりに実際に実行している場合POSTは、@ dbasemanが提案するように実行できます。つまり、2つの要求タイプに対して別々のアクションメソッドを使用します。

しかし、アンカーがjavascript送信を行う場合、私の好みは、送信ボタンに名前を付けて、サーバー上で1つのアクションメソッドで検出できるようにし、そこからコードをフォークすることです。

<submit name="fromButtom" value="Submit" />

そして、あなたの行動方法:

public ActionResult Foo(string fromButton)
{
  //if 'fromButton' contains 'Submit' then you assume it was the button.
}

さらに良いのは、<button>代わりに使用して、表示されたテキストをボタンが送信する値から切り離すことができることです(ページをローカライズしている場合に便利です)。

<button name="submitMethod" value="fromButton">Submit</button>

submitMethodこれで、アクションメソッドにパラメータを設定できます。このパラメータでを検索し'fromButton'ます。

いずれにせよ、ボタンの値はクリックされたときにのみ送信されるため、アンカータグ/ javascript(それがあなたのやり方である場合)はこの値を送信しません。

于 2012-05-22T08:58:10.110 に答える
1

アクションのさまざまなバージョンでMVCHttpPost属性とHttpGet属性を使用するだけです。

[HttpPost]
public ActionResult FormAction(Model model, string method = post) { ... }

[HttpGet]
public ActionResult FormAction(Model model) { ... }
于 2012-05-22T08:55:50.763 に答える
0

Url.ActionまたはHtml.ActionLinkhttp://geekswithblogs.net/liammclennan/archive/2008/05/21/122298.aspxを使用できます

于 2012-05-22T08:57:03.243 に答える
0

メソッドが完全に異なる場合は、JavaScriptを使用して動作を変える必要があります。たとえば、jQueryの場合、次のようになります。

$("#sbutton").click(function() {
  alert("Submit button clicked!");
  // Do whatever you need - validate/initialize-fields/etc.
  return false; // This is required to prevent normal form submit
});

$("#slink").click(function() {
  alert("Link clicked!");
  // Do whatever you need - validate/initialize-fields/etc.
  return false; // This is required to prevent normal form submit
});
于 2012-05-22T09:03:42.373 に答える
0

別の解決策を追加するために、JavaScriptをオフにして動作するものを作成したいが、ボタンの名前と値を変更するのが不便な場合は、本番コードで使用したこれを試すことができます。

次のようなヘルパーを作成します。

using System;
using System.Reflection;
using System.Web.Mvc;

namespace Whatever
{
    [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
    public class MultipleSubmitAttribute : ActionNameSelectorAttribute
    {
        public string Name { get; set; }
        public string Argument { get; set; }

        public override bool IsValidName(ControllerContext controllerContext,
        string actionName, MethodInfo methodInfo)
        {
            bool isValidName = false;
            string keyValue = string.Format("{0}:{1}", Name, Argument);
            var value = controllerContext.Controller.ValueProvider.GetValue(keyValue);
            if (value != null)
            {
                value = new ValueProviderResult(Argument, Argument, null);
                controllerContext.Controller.ControllerContext.RouteData.Values[Name] = Argument;
                isValidName = true;
            }

            return isValidName;
        }
    }
}

そして今、あなたのフォームであなたはこの種のことをすることができます:

<input type="submit" name="action:DoSomething" value="Do something" /> 
<input type="submit" name="action:DoSomethingElse" value="Do something else" />

そして、コントローラーで、アクションメソッドを次のように装飾できます。

[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomething")]
public ActionResult DoSomething(ViewModel vm)
{ ... }

[HttpPost]
[MultipleSubmit(Name = "action", Argument = "DoSomethingElse")]
public ActionResult DoSomethingElse(ViewModel vm)
{ ... }
于 2012-05-22T09:29:39.093 に答える