MVC4如何调用以下控件方法?

时间:2012-05-31 09:52:30

标签: asp.net-mvc-4

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

我想知道以下WebAPI方法。如何将参数传递给方法?我假设那些不是POST数据。由于该方法在我从网络表单发送数据时没有响应。

<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>

1 个答案:

答案 0 :(得分: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 }
);

您将向/api/somecontroller/login发送POST请求。

如果你想遵守惯例,你将拥有以下内容:

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>