我正在使用mvc4 webapi,我想知道如何进行ajax调用,将模型作为参数传递给Get方法。我在Get方法上得到模型null。
//Controller
public HttpResponseMessage GetUsersList(ProfileModel objProfileModel)
{
}
//Jquery Ajax
function GetUsersList()
{
$.ajax({
type: 'POST',
url: '/api/SearchWebApi/GetUsersList',
data: $("#frmsearch").serialize(),
success: function (data)
{
},
error: function (xhr, textStatus, errorThrown)
{
//window.location = JsErrorAction;
},
dataType: "json"
});
return false;
}
答案 0 :(得分:2)
好的,你正在做的事情有一些问题。尝试这些更改:
1)将您的ajax调用更改为GET
而不是POST
$.ajax({type: 'GET', ...
或将您的操作名称更改为Post(ProfileModel objProfileModel)
,但我认为在您进行搜索时,此案例中的获取更为RESTful。
2)不要将您的行为作为您网址的一部分。 web-api路由约定使用http动词来确定要使用的操作。因此,如果您的控制器被称为SearchWebApi
,您的网址就是这样:
url: '/api/SearchWebApi/'
路由引擎会发现get将转到名称中带get
的方法/操作。
3)将表单数据放在正文中应该没问题。但请注意,您可能需要通过标记参数来明确说出这一点:
GetUsersList([FromBody] ProfileModel objProfileModel)
修改强>
要解决有关多个get方法的问题,我想有几个选项。
Web Api中的“约定”是每个资源都有一个单独的控制器。因此,您将拥有一个Image控制器和一个单独的Users控制器。因此,没有冲突和网址仍然有意义:
GET /api/images/
GET /api/users/
您可以在控制器上拥有多个Get方法,但它们不会发生冲突。因此,您将看到许多控制器用于具有返回集合的Get的资源,以及用于获取特定资源的get的get。
public HttpResponseMessage Get()
public HttpResponseMessage Get(int id)
但实际上,这一切都取决于您希望如何指定API以及如何定义路线。 默认 api路由是:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
请注意,这并未指定操作。如果您想在同一个控制器上允许多个获取,您只需在网址中添加{action}
段,就像常规的Mvc一样。
config.Routes.MapHttpRoute(
name: "DefaultApiWithAction",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);