ASP MVC和更改发布表单的URL

时间:2014-05-29 15:07:05

标签: c# asp.net asp.net-mvc asp.net-mvc-4

我有一个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永远不会改变的方式放置更新,但我试图避免这种形式。

1 个答案:

答案 0 :(得分:0)

从概念上讲,您希望做类似Server.Transfer的操作(即,使URL显示为另一个。)此讨论可能对您有用:

How to simulate Server.Transfer in ASP.NET MVC?