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>

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

4

3 回答 3

27

由于没有人在这里真正回答,我将添加我的 .02

MVC 将以下字段添加到 html 表单(例如在使用 Html.BeginForm() 时使用)来支持这一点。即使 Html5 实际上不支持 HttpPut 和 HttpDelete(它们曾一度从规范草案中删除),当以下表单字段与您的 HttpPost 请求:


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

于 2012-11-09T21:52:05.700 回答
7

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

通过使用由服务器读取并相应分派的隐藏表单字段,通过 POST 方法解决此问题。

现在,您可以考虑使用[HttpPost]now 或 use XmlHttpRequesttoPut在您的请求中使用动词。


更新

您可以SimplyRestfulRouteHandler使用MvcContrib

很简单,注册这个RegisterRoutes

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

在您的内部添加一个hidden带有名称的字段_methodform

<input type="hidden" name="_method" value="put" />

这会很好。

于 2011-11-18T12:51:06.710 回答
4

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

是一个例子

于 2011-11-18T18:44:54.070 回答