0

我正在使用我正在使用的 mvc4 web api 应用程序

@{
        AjaxOptions addAjaxOpts = new AjaxOptions {
            OnSuccess = "getData",
            Url = "/api/reservation"
        };
    }
    @using (Ajax.BeginForm(addAjaxOpts)) { 
        @Html.Hidden("ReservationId", 0) 
        <p><label>Name:</label>@Html.Editor("ClientName")</p>
        <p><label>Location:</label>@Html.Editor("Location")</p>
        <button type="submit">Submit</button>
    }

用于添加并将表单提交给 ApiController 中的 PostReservation 方法,但是当我尝试使用 Ajax.BeginForm 进行编辑时,它会将请求提交给 PostReservation 而不是 PutReservation。我还尝试将 @Html.HttpMethodOverride(HTTPVerbs.Put) 放入表单中,但仍然无法正常工作

4

1 回答 1

0

HTML 表单仅支持 POST 或 GET。您可以在浏览器中手动执行 ajax 调用,指定 HTTP 方法,或者您可以使用 Http Tunelling,但最后一个需要 ASP.NET Web API 上的自定义代码来执行路由。ASP.NET Web API 没有开箱即用的 HTTP Tunelling。

你需要一个像这样的 HttpMessageHandler 来支持调谐,

public class MethodTunellingDelegatingHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        if (request.Method == HttpMethod.Post && request.Headers.Contains("X-HTTP-Method-Override"))
        {
            var newMethod = request.Headers.GetValues("X-HTTP-Method-Override").FirstOrDefault();
            if (!string.IsNullOrEmpty(newMethod)) {
                request.Method = new HttpMethod(newMethod);
            }
        }
        return base.SendAsync(request, cancellationToken);
    }
}
于 2013-04-30T14:56:40.407 回答