配置路由asp.net webapi

时间:2014-11-13 06:05:13

标签: c# asp.net asp.net-mvc angularjs asp.net-web-api

我正在使用asp.net webapi后端构建一个angularJS应用程序。在我的routeconfig文件中,我有这个

routes.MapRoute(
    name: "default",
    url: "{*url}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);

这很好用。任何被调用的Url都会返回到Home / Index视图(我拥有的唯一视图)到应用程序,如果有一个查询字符串并找出要显示的状态,angularJS会运行。

我在WebApi中有基本的Get,Put,Post和Delete方法,我可以称之为正常。例子是

public class CompanyController : ApiController
{
    private CompanyService _service;

    public CompanyController(CompanyService service)
    {
        _service = service;
    }

    public async Task<IHttpActionResult> Get()
    {
        ...

        return Ok(model);
    }

    public async Task<IHttpActionResult> Get(int id)
    {
        ...

        return Ok(model);
    }

    public async Task<IHttpActionResult> Post(CompanyModel model)
    {
        ...

        return Ok();
    }

    public async Task<IHttpActionResult> Put(Company model)
    {
        ...

        return Ok();
    }

    public async Task<IHttpActionResult> Delete(CompanyModel model)
    {
        ...

        return Ok();
    }
}

现在我想为我的api添加另一个方法,用户可以在其中加载公司,但也传入一个术语来搜索(字符串),pageSize(int)和页码(int)。像这样的东西

public async Task<IHttpActionResult> Get(string term, int page, int pageSize) {
    ...

    return Ok(results);
}

现在我明白我需要添加另一条路线,以确保可以调用此方法。很好,所以我把它添加到我的RouteConfig。

// search
routes.MapRoute(
    name: "search",
    url: "api/{controller}/{page}/{pageSize}/{term}",
    defaults: new { page = @"\d+", pageSize = @"\d+", term = UrlParameter.Optional }
);

为什么这不起作用?当我尝试通过postman使用url localhost / api / company / 1/10 / a调用它时,我找到了一个资源无法找到错误,其中1 = page,10 = pageSize和a = term

它可能是一个简单的答案,但对于MVC来说还是新手,所以还在学习。

1 个答案:

答案 0 :(得分:1)

1-您正在使用Get方法,这意味着您可以通过Url传递搜索选项,因此您可以创建一个搜索选项对象,如:

public class SearchOptions
{
   public string Term{get; set;}
   public int Page {get; set;}
   public int PageSize {get; set;}
}

然后你可以改变你的方法

[HttpGet]
[Route("api/blabla/SearchSomething")]
public async Task<IHttpActionResult> Get([FromUri]SearchOptions searchOptions) {
    ...

    return Ok(results);
}

注意我已经为方法装饰的Route属性,你可以对方法参数使用不同的约束,看看this

最后,您可以像这样从客户端调用该方法

api/blabla/SearchSomething?term=somevalue&page=1&pageSize=10

希望有所帮助。