2012-05-31 98 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