0

フォームで複数の送信ボタンを処理するための良いトリックを探していましたが、この URL からアドバイスを得て、フォローしましたが失敗しました。 ASP.NET MVC フレームワークで複数の送信ボタンをどのように処理しますか?

@Andrey Shchekinによって投稿されました。

彼はちょうど以下のようなクラスを作成すると言ったので、同じコントローラーで行いました

public class HttpParamActionAttribute : ActionNameSelectorAttribute {
    public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) {
        if (actionName.Equals(methodInfo.Name, StringComparison.InvariantCultureIgnoreCase))
            return true;

        if (!actionName.Equals("Action", StringComparison.InvariantCultureIgnoreCase))
            return false;

        var request = controllerContext.RequestContext.HttpContext.Request;
        return request[methodInfo.Name] != null;
    }
} 

次に、ビューの複数の送信ボタンは次のようになり、コントローラーコードも次のようになります

<% using (Html.BeginForm("Action", "Post")) { %>
  <!— …form fields… -->
  <input type="submit" name="saveDraft" value="Save Draft" />
  <input type="submit" name="publish" value="Publish" />
<% } %> 

and controller with two methods

public class PostController : Controller {
    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult SaveDraft(…) {
        //…
    }

    [HttpParamAction]
    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Publish(…) {
        //…
    } 
}

しかし、彼のコードをテストしてもうまくいきません。そのため、私がどこで間違いを犯しているのか、コード自体が状況を処理するのに間違っているのかを教えてくれます。ありがとう

4

2 に答える 2

4

意見:

<input type="submit" name="mySubmit" value="Save Draft" />
<input type="submit" name="mySubmit" value="Publish" />

コントローラーのアクション:

[HttpPost]
public ActionResult ActionName(ModelType model, string mySubmit)
{
   if(mySubmit == "Save Draft")
   {
      //save draft code here
   } else if(mySubmit == "Publish")
   {
      //publish code here
   }
}
于 2013-09-16T14:03:52.827 に答える
1

ユーザーが病院の乳児記録の進行状況をファイナライズまたは保存できるという要件があったとき、同様のシナリオに対処する必要がありました。基本的に両方のアクションが送信されますが、1 つはメイン DB テーブルに挿入するためにレコードを検証し、もう 1 つはそれを検証なしの一時テーブル。私はそれを次のように処理しました:

2 つのボタンがあり、どちらも異なる ID (btnSave と btnFinalize) の送信タイプです。btnSave がクリックされると、そのイベントをいくつかの JQuery コードでインターセプトします。

$("#btnSave").click(function () {
   $("#SaveForm").validate().settings.rules = null;
   $('#SaveForm').attr('action', '@(Url.Content("~/Home/EditCase?finalize=false"))');
});

ご覧のとおり、フォームの action 属性を変更して、クエリ文字列属性が finalize = false の別の URL を指すようにします。また、モデルに存在する検証も削除します。他のボタンがクリックされた場合、何もしません - デフォルトの動作を実行します。

私のコントローラーには、両方の送信アクションを処理する単一のアクションがあります。

public ActionResult EditCase(EditInfantModel model, bool finalize = true)
{
    // Logic for handling submit in here...
}

あなたの問題に同様の手法を適用できると思います。それがあなたが探している答えかどうかはわかりませんが、言及する価値があると思いました...

于 2013-09-16T13:43:01.247 に答える