HTML表单上的ASP.NET MVC中的PUT或DELETE谓词

时间:2011-11-18 12:44:59

标签: asp.net-mvc asp.net-mvc-3 rest html-form http-put

我有一个简单的用户注册表单,有两个字段,一个用于用户名,另一个用于密码。我有一个名为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>

我在这里想念什么?怎么了?

3 个答案:

答案 0 :(得分:24)

由于这里没有人真的回答,我会加上我的.02

MVC将以下字段添加到html表单(例如,在使用Html.BeginForm()时)用于支持此字段。 尽管Html5实际上并不支持HttpPut和HttpDelete(它们只是在某一点然后从草案规范中删除),但是当发布以下表单字段时,MVC的服务器库将正确地将请求路由到您的HttpDelete或HttpPut方法。您的HttpPost请求:


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

答案 1 :(得分: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);
}

hidden

中添加名称为_method的{​​{1}}字段
form

这样做会很好。

答案 2 :(得分:4)

您可以使用$ .ajax提交带有正确动词的表单

Here就是一个例子