我有一个MVC 4应用程序,我正在为我的URL使用RESTful方法。我在我的应用程序中注册了以下路线(以及与我的问题无关的其他路线:
//EDIT
routes.MapRoute(alias + "_EDIT", alias + "/{id}/edit",
new { controller = controllerName, action = "edit" },
new { httpMethod = new RestfulHttpMethodConstraint(HttpVerbs.Get) });
//PUT (update)
routes.MapRoute(alias + "_PUT", alias + "/{id}",
new { controller = controllerName, action = "update" },
new { httpMethod = new RestfulHttpMethodConstraint(HttpVerbs.Put) });
我的控制器中有以下方法映射到这些路径:
public override ActionResult Edit(int id)
{...}
public override ActionResult Update(RequestEditViewModel userModel)
{
if (!ModelState.IsValid)
{
//do some stuff to ensure lookups are populated
...
return View("Edit", userModel);
}
}
在我的应用中,当我执行编辑请求的请求时,我的网址如下:
http://server/request/1/edit
它正确调用我控制器上的Edit方法。
我的Edit.cshtml使用followng来确保在PUT上调用Update方法:
@using (Html.BeginForm("Update", "Request"))
{
@Html.HttpMethodOverride(HttpVerbs.Put);
...
}
我的表单生成如下:
<form action="/requests/71" method="post" autocomplete="off" novalidate="novalidate">
<input name="X-HTTP-Method-Override" type="hidden" value="PUT"/>
...
</form>
当我点击提交按钮时,它正确调用我的Update方法。
好的......现在问题了。如果我的模型无效,我想返回编辑模型。正如您在上面的代码中看到的那样,URL是从提交按钮调用的URL:
http://server/request/1
不是
http://server/requests/1/edit
我已经尝试了另外两个选项,但这两个选项都会再次通过Edit方法重新定向请求,这会增加额外的开销,并且还会将所有模型值放在我不想要的查询字符串中:
return RedirectToAction("Edit", userModel);
return RedirectToRoute("requests_Edit", userModel);
所以,是否可以像我在代码中一样返回视图,但是,请确保更改网址并包含“/ edit”?
我提出的唯一选择是执行一个AJAX调用,并以URL永远不会改变的方式放置更新,但我试图避免这种形式。
答案 0 :(得分:0)
从概念上讲,您希望做类似Server.Transfer的操作(即,使URL显示为另一个。)此讨论可能对您有用: