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

Интересно, как выглядит следующий метод WebAPI. Как передать параметры в метод? Я предполагаю, что это не данные POST. Поскольку метод не ответил, когда я отправлял данные из веб-формы.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

Да, но я просто хотел бы попробовать метод пост в WebAPI, Я не мог найти лучшего способа попробовать, чем использовать веб-форму. – starcorn

+0

Хорошо, тогда вы можете использовать веб-форму. Просто убедитесь, что у вас есть правильная настройка маршрута, которая приведет к этому * нетрадиционному * имени действия 'Login'. Или придерживаться условностей. –

+0

Должно ли 'action' быть'/api/authenicate/login' и имя метода в контроллере должно быть 'login'? – starcorn

Смежные вопросы