0
[HttpPost]
        public HttpResponseMessage<Response> Login(string username, string password) { ... }

我想知道以下 WebAPI 方法。如何将参数传递给方法?我认为那些不是 POST 数据。由于当我从 Web 表单发送帖子数据时该方法没有响应。

<form action="/api/Authenticate/Login" id="loginForm" method="post">
    <fieldset>
    <legend>Userdata:</legend>
        <label for="username">Username</label>
        <input id="username" name="username" type="text" value="" />
        <label for="password">Password</label>
        <input id="password" name="password" type="password" value="" />
        <button type="submit">Login</button>
    </fieldset>
</form>
4

1 回答 1

0

Web API 方法不打算用作 HTML 表单的操作,因为它们通常不返回 HTML。它们旨在从常规 ASP.NET MVC 控制器中使用。因此,虽然您可以使用 POST 动词调用此方法并将两个参数作为 POST 请求正文的一部分传递,但具体取决于您配置的媒体类型是 XML 还是 JSON。另一种可能性是使用客户端 javascript AJAX 调用来调用此方法。要考虑的另一件事是不标准的方法名称:Login. 如果您希望能够调用它,您将需要修改使用您的应用程序创建的默认路由并将{action}令牌包含到路由中。

所以:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

应该变成:

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{action}/{id}",
    defaults: new { id = RouteParameter.Optional }
);

你将发送一个 POST 请求到/api/somecontroller/login.

如果您想遵守约定,您将拥有以下内容:

public class LoginController : ApiController
{
    // POST /api/login
    public HttpResponseMessage<Response> Post(string username, string password)
    {
        ...
    }
}

进而:

<form action="/api/login" id="loginForm" method="post">
    <fieldset>
    <legend>Userdata:</legend>
        <label for="username">Username</label>
        <input id="username" name="username" type="text" value="" />
        <label for="password">Password</label>
        <input id="password" name="password" type="password" value="" />
        <button type="submit">Login</button>
    </fieldset>
</form>
于 2012-05-31T09:54:59.343 回答