2012-05-31 62 views
0
[HttpPost] 
     public HttpResponseMessage<Response> Login(string username, string password) { ... } 

我想知道下面的WebAPI方法。如何将参数传递给方法?我假设这些不是POST数据。由于该方法在我从Web表单发送数据时没有响应。MVC4我怎样才能调用下面的控制方法?

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

回答

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

是的,但我只是想尝试一下POST方法中的WebAPI,我找不到比使用网页表单更好的方法。 – starcorn

+0

好的,那么你可以使用网页表单。只要确保你有正确的路由设置,这将导致这个*非常规*操作名称'登录'。或者坚持惯例。 –

+0

如果'action'是'/ api/authenicate/login'并且控制器中的方法名称应该是'login'? – starcorn