Подтвердить что ты не робот

PUT или DELETE в ASP.NET MVC для HTML-формы

У меня простая форма регистрации пользователя с двумя полями: одна для имени пользователя и другая для пароля. У меня есть контроллер под названием 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>

Что мне здесь не хватает? Что не так?

4b9b3361

Ответ 1

Поскольку никто на это не ответил, я добавлю свой .02

MVC добавляет следующее поле в форму html (используется, например, при использовании Html.BeginForm()) для поддержки этого. Несмотря на то, что HttpPut и HttpDelete на самом деле не поддерживаются для Html5 (они были в какой-то момент, а затем удалены из спецификации проекта), серверные библиотеки для MVC будут правильно направлять запрос на ваш метод HttpDelete или HttpPut, когда будет отправлено следующее поле формы ваш запрос 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] сейчас или использовать XmlHttpRequest для использования глагола Put по вашему запросу.


UPDATE

Вы можете использовать SimplyRestfulRouteHandler из MvcContrib

Это довольно просто, зарегистрируйте это на RegisterRoutes

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

Добавьте поле hidden, подобное этому, с именем _method внутри вашего form

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

Это было бы неплохо.

Ответ 3

Вы можете использовать $.ajax, чтобы отправить форму с правильным глаголом

Здесь приведен пример