【问题标题】:Configuring Routes asp.net webapi配置路由 asp.net webapi
【发布时间】:2014-11-13 06:05:13
【问题描述】:

我正在构建一个带有 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 }
);

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

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

【问题讨论】:

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


【解决方案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

希望对您有所帮助。

【讨论】:

  • 谢谢你。会检查出来。在您的示例中,您将如何调用该 get 方法?我不确定 fromurl 部分?
  • [FromUri] 告诉模型绑定器从查询字符串而不是请求正文构造 SearchOptions,因此您需要使用查询字符串传递搜索选项。看到这个asp.net/web-api/overview/formats-and-model-binding/…
  • 完美。谢谢你
猜你喜欢
  • 2017-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多