在HTML表单中使用ASP.NET MVC的PUT或DELETE动词

14

我有一个简单的用户注册表格,包含两个字段,一个用于用户名,另一个用于密码。我有一个名为UserController的控制器,其中包含这两个操作:

[HttpGet]
public ActionResult Register()
{
    return View();
}

[HttpPut]
public ActionResult Register(string username, string password)
{
    // Registering user
    return View();
}

我使用了HTTP Put方法使我的网站符合RESTful架构(使用PUT方法进行插入操作)。但是,当我提交表单时,会出现404错误。这是我的表单的HTML代码:

<form action='@Url.Action("Register", "User")' method="post">
<div class='field'>
    <label for='username'>
        Username:
    </label>
    <input type='text' id='username' name='username' maxlength='100' />
</div>
<div class='field'>
    <label for='password'>
        Password:
    </label>
    <input type='password' id='password' name='password' maxlength='50' />
</div>
</form>

我在这里错过了什么?有什么问题吗?


你考虑过这个问题吗?https://dev59.com/_3VC5IYBdhLWcg3w2k-I - FosterZ
很好的帖子@FosterZ,谢谢。不过,我正在寻找在ASP.NET MVC中的解决方案实现。你知道我该如何实现吗? - Saeed Neamati
3个回答

27

鉴于目前没有人回答这个问题,我来发表一下我的意见。

MVC在html表单中增加了以下字段(例如在使用Html.BeginForm()时),以支持此功能。 尽管HttpPut和HttpDelete实际上不受Html5支持(它们曾经被包含在草案规范中,但后来被删除),但MVC的服务器库将正确路由请求到您的HttpDelete或HttpPut方法,当以下表单字段与您的HttpPost请求一起提交时:


@using (Html.BeginForm("SomeAction")){ 
   @Html.HttpMethodOverride(HttpVerbs.Delete)
}

这段代码是在ASP.NET MVC中使用的,用于创建一个表单并将HTTP方法覆盖为"Delete"。通过使用Html.BeginForm()辅助方法可以创建一个包含指定操作名称和控制器名称的表单,并返回一个表单元素。@Html.HttpMethodOverride()则允许我们以DELETE HTTP方法提交该表单。

7

HTML表单(HTML版本4和XHTML 1)仅支持GET和POST作为HTTP请求方法。XHTML 2.0将支持GET、POST、PUT和DELETE用于表单。

对于通过POST方法的解决方法是使用一个隐藏的表单字段,服务器读取并相应地分派。

目前,您可以考虑现在使用[HttpPost]或使用XmlHttpRequest在请求中使用Put动词。


更新

您可以使用MvcContrib中的SimplyRestfulRouteHandler

这很简单,在RegisterRoutes上注册即可

public static void RegisterRoutes(RouteCollection routes)
{
     SimplyRestfulRouteHandler.BuildRoutes(routes);
}

在您的表单中添加一个类似于以下内容的带有名称为 _methodhidden 字段。
<input type="hidden" name="_method" value="put" />

这个可以使用。


但我知道ASP.NET原生支持HTTP Put。我该如何让ASP.NET MVC在我的表单中设置一个隐藏字段,并将提交的表单发送到我的正确方法,该方法具有[HttpPut]属性? - Saeed Neamati
1
ASP.Net原生支持它,但你需要关注的是浏览器。仅仅因为你的服务器端代码识别PUT动词并不意味着客户端也这样做。提交HTML表单的浏览器只支持GET和POST。 - EAMann

4
你可以使用$.ajax以正确的动词提交表单。
这里是一个示例

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接