0

2 つのプロパティ (たとえば、CategoryId と DepartmentId) を持つリソース (従業員など) を取得するコントローラがあります。次の URL をサポートするようにルートを構成する必要があります。

~/api/employees/1234 [to get the employee with employeeId=1234]
~/api/employees [to get all the employees]
~/api/employees?departmentid=1 [to get all the employees with departmentId=1]

コントローラーのコードは次のようになります。

public IEnumerable<Employee> Get()
{
    ....
}

public IEnumerable<Employee> Get(int employeeId, int departmentId = -1, int categoryId = -1)
{
    .....
}

このコントローラーのルートを構成する方法は?

ありがとう

4

2 に答える 2

0

属性ルーティングの使用について調べましたか? 現在、MapHttpRoute で使用していたデフォルトの /controller/action タイプのルートを完全に削除するまで、属性ルーティングを広範囲に使用しています。

代わりに、コントローラーを次のように装飾します。最初に、コントローラーのルート プレフィックスを作成して、必要なベース ルートが何であるかを確認します。

/// <summary>   A controller for handling products. </summary>
[RoutePrefix("api/purchasing/locations/{locationid}/products")]
public class ProductsController : PurchasingController
{

次に、コントローラーの各アクションを次のように装飾します。

    [Route("", Name = "GetAllProducts")]
    public IHttpActionResult GetAllProducts(int locationid, ODataQueryOptions<FourthPurchasingAPI.Models.Product> queryOptions)
    {
        IList<Product> products = this.GetProducts(locationid);

    [Route("{productid}", Name = "GetProductById")]
    public IHttpActionResult GetProduct(int locationid, string productid)
    {
        Product product = this.GetProductByID(locationid, productid);

したがって、api/purchasing/locations/1/products/への呼び出しは「GetAllProducts」という名前のルートに解決され、api/purchasing/locations/1/products/1 への呼び出しは「GetProductById」という名前のルートに解決されます。

次に、コントローラーで同じ署名を使用して別の GetProduct アクションを作成できます。属性ルートを適切に設定するだけです。

    [Route("/department/{departmentId}", Name = "GetAllProductsForDepartment")]
    public IHttpActionResult GetAllProductsWithDeptId(int locationid, int departmentId)
    {
        IList<Product> products = this.GetProducts(locationid, departmentId);

api/purchasing/locations/1/products/department/1234への呼び出し は、「GetAllProductsForDepartment」という名前のルートに解決されます。

この例では Web Api 2 を使用していることはわかっていますが、Web Api の属性ルーティングに関するこのリンクを参照してください。IHttpActionResult 以外のものを返す代わりに、まったく同じである必要があります。

于 2014-10-23T15:49:51.073 に答える
0

任意の querystyring パラメーターについて、ルーティング側で行うことはありません。コントローラー メソッドのパラメーターを qs パラメーター名と一致させるだけです (大文字と小文字は区別されません)。

代わりに、メソッド パラメーターが uri セグメントを参照する場合、メソッド パラメーター名は、中括弧内のルート パラメーター/セグメントと一致する必要があります。

routes.MapHttpRoute(
    name: "API Default",
    routeTemplate: "/api/{controller}/{employeeId}",
    defaults: new { id = RouteParameter.Optional }
);

つまり、次のメソッドを持つコントローラーが必要です

public class EmployeesController : ApiController
{
public IEnumerable<Employee> Get(int employeeId){...} 
}

アクションを使用しない限り、コントローラーでは http 動詞ごとに 1 つのメソッドしか使用できないことに注意してください。
つまり、動詞 get に 2 つのメソッドを持つサンプルは、両方に明示的なアクションを使用しない限り機能しません。

于 2013-09-25T09:23:56.297 に答える