如何在Razor表单提交中显式指定控制器方法

时间:2014-11-21 01:06:52

标签: asp.net-mvc razor form-submit

如何更好地控制我的Razor表单提交调用哪个控制器方法?

我的控制器有两种方法:

public ActionResult ControllerMethod()
{
    MyModel savedModel = GetSaveModelFromSomewhere();
    // do some specific stuff here...
    return ControllerMethod(savedModel);
}

public ActionResult ControllerMethod(MyModel model)
{
    // do some general stuff here...
}

我的观点包含:

@Model MyModel

@using (Html.BeginForm("ControllerMethod", "Home", FormMethod.Post))
{
        <input id="Submit" type="submit" value="Update Profile" class="btn" />
}

我认为因为视图正在使用MyModel,所以框架会自动调用ControllerMethod(MyModel)但是如何明确地让它调用第一个ControllerMethod()

我可以通过在ControllerMethod()中使用[AcceptVerbs("GET")]进行装饰并在视图中使用FormMethod.Get来实现此目的,但这对我来说似乎是一种解决方法。

3 个答案:

答案 0 :(得分:3)

你可能会对它的运作方式感到困惑。对于需要创建或编辑数据的每个操作,通常都有GET和POST方法。 GET方法初始化您的模型并将其返回到视图以便以表单

进行编辑
[HttpGet] // this is the default and is not strictly required
public ActionResult ControllerMethod()
{
  MyModel model = GetSaveModelFromSomewhere();
  return View(model);
}

您可以使用/Home/ControllerMethod和视图

进行调用
@Model MyModel
@using (Html.BeginForm())
{
  // render controls for your model
  <input id="Submit" type="submit" value="Update Profile" class="btn" />
}

和POST方法

[HttpPost] // this attribute distinguishes the POST method from the GET method
public ActionResult ControllerMethod(MyModel model)
{
  if(!ModelState.IsValid)
  {
    return View(model); // return the view to correct errors
  }
  // Save the model and redirect to somewhere else.
  RedirectToAction("SomeOtherMethod");
}

您只能为同一签名使用一种POST方法。如果您想回发到另一种方法,请说

[HttpPost]
public ActionResult AnotherMethod(MyModel model)

然后在视图中

@using (Html.BeginForm("AnotherMethod", "Home"))

答案 1 :(得分:1)

您可以使用[HttpPost]修饰帖子方法。

答案 2 :(得分:1)

事实上,你不是通过将调用嵌套到你的GET方法中应该是你的POST方法来做自己的任何好处。如果您只是回复正确的方法,那么就不会有任何问题。

// This is the GET method. It should return your model in the view.
public ActionResult Edit()
{
    MyModel savedModel = GetSaveModelFromSomewhere();
    // do some specific stuff here...
    return View(savedModel);
}

// This is the POST method. It now accepts your model back from the POST.
[HttpPost]
public ActionResult Edit(MyModel model)
{
    // do some general stuff here...

    if (success)
    {
        return RedirectToAction("Index");
    }
    else
    {
        // Show the view again if saving the edits failed for any reason.
        return View(model);
    }
}

您可以随时将任何共享代码包装到第三方法或共享服务中(如果您正在尝试通过嵌套操作调用来实现这一点。