如何更好地控制我的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
来实现此目的,但这对我来说似乎是一种解决方法。
答案 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);
}
}
您可以随时将任何共享代码包装到第三方法或共享服务中(如果您正在尝试通过嵌套操作调用来实现这一点。