【问题标题】:PUT or DELETE verb in ASP.NET MVC on HTML formHTML 表单上的 ASP.NET MVC 中的 PUT 或 DELETE 动词
【发布时间】:2012-01-01 05:29:30
【问题描述】:

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

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

【问题讨论】:

  • 你考虑过这个问题吗stackoverflow.com/questions/165779/…
  • 好帖子@FosterZ,谢谢。但是,我正在寻找 ASP.NET MVC 中的解决方法实现。你知道我该如何实现吗?

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    目前,您可以考虑使用 [HttpPost] now 或使用 XmlHttpRequest 来根据您的请求使用 Put 动词。


    更新

    您可以从MvcContrib 使用SimplyRestfulRouteHandler

    很简单,注册RegisterRoutes

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

    在您的form 中添加一个名称为_methodhidden 字段

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

    这很好。

    【讨论】:

    • 但我知道 ASP.NET 支持 HTTP 开箱即用。如何让 ASP.NET MVC 在我的表单中设置一个隐藏字段并将提交(发布)的表单发送到我的正确方法,该方法具有 [HttpPut] 属性?
    • ASP.Net 支持开箱即用,是的,但您需要注意的是 浏览器。仅仅因为您的服务器端代码识别 PUT 动词并不意味着客户端可以识别。提交 HTML 表单的浏览器仅支持 GET 和 POST。
    【解决方案3】:

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

    Here 是一个例子

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 2012-06-10
      • 1970-01-01
      • 2020-05-19
      • 2014-03-20
      相关资源
      最近更新 更多