在提交时更改mvc表单控制器

时间:2017-12-05 18:38:45

标签: c# asp.net-mvc post razor

我最近遇到了这个问题,因为我有一个我需要解决的问题。

我有一个控制器,它使用某种方法来做一些逻辑:

from flask import Flask
from flask import jsonify
import subprocess
import threading

app = Flask(__name__)

def _reboot():
    subprocess.call("/sbin/reboot")

@app.route('/api/reboot')
def reboot():
    t = threading.Timer(1, _reboot)
    t.start()
    return jsonify(triggered='reboot')

if __name__ == '__main__':
    app.run(debug=True,host="0.0.0.0")

我有第二个控制器,它有不同的逻辑:

   public Controller1: MvcController
   {
     public ActionResult SomeLogic(Model model)
     {
       return view();
     }
     public ActionResult SomeLogic2(Model model)
     {
       return view();
     }
  }

两者都在处理相同的观点:

   public Controller2: MvcController
   {
     public ActionResult SomeLogic(Model model)
     {
       return view();
     }
     public ActionResult SomeLogic2(Model model)
     {
       return view();
     }
  }

该视图包含一个适用于提交的开始表单:

MyView.cshtml

和4个提交按钮:

@using(Html.BeginForm("SomeLogic", "Controller1", FormMethod.Post)

我知道我可以使用以下命令控制我重定向提交的操作: <input type='submit' formaction='SomeLogic' value='submit' /> <input type='submit' formaction='SomeLogic2' value='submit2' /> <input type='submit' formaction='SomeLogic' value='submit3' /> <input type='submit' formaction='SomeLogic2' value='submit4' /> 属性。

我有办法改变控制器吗?意思是:

formaction

将提交至<input type='submit' formaction='SomeLogic' value='submit3' /> <input type='submit' formaction='SomeLogic2' value='submit4' /> 而不是我的开始表单中定义的controller2

这将解决我是否要创建新控制器或使用已经充满复杂逻辑的现有控制器的争论。

2 个答案:

答案 0 :(得分:1)

使用jQuery拦截提交

您可以在表单中添加ID,以便能够在jQuery中轻松选择

@using(Html.BeginForm("SomeLogic", "Controller1", FormMethod.Post, new { @id = "yourForm" })

然后

$("#yourForm").submit(function(e){
    e.preventDefault();

    var url1 = '@(Url.Action("SomeLogic1", "SomeController", null, Request.Url.Scheme))';
    var url2 = '@(Url.Action("SomeLogic", "SomeController2", null, Request.Url.Scheme))';

    //Whatever logic should you do to select which URL you want to POST to

    $.ajax({
        type: 'POST',
        url: url_selected_above,
        data: $('#yourForm').serializeArray(),
        success: function (xhr, response) {
             //...
        },
        error: function (xhr, response) {
            //...
        }
    });
});

如果所有方法都期望相同的视图模型,这应该有效。

或者,如果您不想在UI中乱七八糟,可以在生成表单的操作中执行此操作。

var controllerName = "SomeController";
var actionName = "Action1";

//do your logic to select whichever controller/action.

viewModel.ControllerName = controllerName;
viewModel.ActionName = actionName;

并且在视图中具有以下形式:

@using(Html.BeginForm(@Model.ActionName, @Model.ControllerName, FormMethod.Post)

同样,如果所有操作都需要相同的视图模型,那么它应该可以工作。

答案 1 :(得分:1)

您需要在formaction属性中包含控制器名称。

请注意,您的控制器名称无效,但假设您有

public FirstController: Controller
{
    [HttpPost]
    public ActionResult SomeLogic(Model model)
    {
        return view();
    }
}
public SecondController: Controller
{
    [HttpPost]
    public ActionResult SomeLogic(Model model)
    {
        return view();
    }
}

然后您可以使用

发布到正确的控制器
// Post to the SomeLogic method of FirstController
<input type="submit" formaction="@Url.Action("SomeLogic", "First")" value="submit" />
// Post to the SomeLogic method of SecondController
<input type="submit" formaction="@Url.Action("SomeLogic", "Second")" value="submit3" />