ASP MVC和更改url张贴的形式

本文关键字:张贴 url MVC ASP | 更新日期: 2023-09-27 18:05:41

我有一个MVC 4应用程序,我使用RESTful方法为我的url。我在我的应用程序中注册了以下路由(以及其他与我的问题无关的路由):

    //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);
   }
}

在我的应用程序中,当我执行请求编辑请求时,我的URL看起来像:

http://server/request/1/edit

它正确地调用了控制器上的Edit方法。

我的编辑。cshtml使用以下命令来确保在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是从提交按钮调用的:

http://server/request/1

http://server/requests/1/edit

我已经尝试了另外两个选项,但这两个选项都通过Edit方法再次将请求重定向回,这增加了额外的开销,并且还将所有模型值放在我不想要的查询字符串中:

return RedirectToAction("Edit", userModel);
return RedirectToRoute("requests_Edit", userModel);

所以,是否有一种方法,只是返回视图,因为我在我的代码,但是,确保URL更改回来,包括"/edit"?

我想到的唯一替代方法是执行AJAX调用,并以URL永远不会改变的方式进行更新,但我试图避免这种情况。

ASP MVC和更改url张贴的形式

从概念上讲,您希望做一些类似于服务器的事情。传输(即使一个URL看起来是另一个URL)。这个讨论可能对你有用:

如何模拟服务器。在ASP中传输。净MVC吗?