2017-08-01 23 views
5

Tìm các phương pháp hay nhất khi làm việc với các tuyến lồng nhau trong .NET Core MVC.NETCORE MVC - Cách làm việc với các tuyến lồng nhau, nhiều tham số

Hãy nói rằng CampusController.cs làm việc với một mô hình cơ sở:

[Route("api/campus/")] 
public class CampusController : Controller 
{ 
    ... 
    [HttpGet] 
    [Route("{campusId}")] 
    public IActionResult GetCampusInfo ([FromQuery]int campusId) { ... } 
} 

BuildingController.cs làm việc với một người mẫu trẻ:

[Route("api/campus/{campusId}/building")] 
public class BuildingController : Controller 
{ 
    ... 
    [HttpGet] 
    [Route("{buildingId}")] 
    public IActionResult GetBuilding ([FromQuery]int buildingId) { ... } 

    [Route("{buildingId}/")] 
    public IActionResult GetBuilding ([FromQuery]int buildingId) { ... } 
    .... 
    (more Action Methods) 
} 

Nếu buildingId bản đồ trực tiếp đến cơ sở dữ liệu nó có thể lấy ra ngay cả khi cung cấp campusId không phải là cha mẹ. Để giữ cho URL sạch sẽ khi gọi /api/campus/{campusId}/building/{buildingId} Tôi muốn xác thực {campusId} và trả về mã IActionResult 4xx nếu mã đó không hợp lệ. Phải có cách tốt hơn là bao gồm logic xác thực trong mọi Phương thức hành động bên trong BuildingController.

  • Có cách nào để xếp nhiều phương thức Hành động trên các bộ điều khiển khác nhau không? Vì vậy, một phương pháp xác nhận trên CampusController sẽ được gọi đầu tiên và lần lượt gọi một phương thức trên BuildingController?
  • Có cách nào để xác minh mức điều khiển campusId có thể đoản mạch và trả về ActionResult nếu xác thực không thành công không?

EDIT: Khi tôi tham chiếu đến logic xác thực, tôi có nghĩa là tín hiệu API; không phải logic nghiệp vụ thực sự xác định nếu campusId là/không hợp lệ.

Cảm ơn trước!

Trả lời

5

Nếu sử dụng giữ chỗ trong các tiền tố tuyến đường bạn cũng sẽ cần phải bao gồm nó trong hành động tự

[Route("api/campus/{campusId:int}/building")] 
public class BuildingController : Controller { 
    //... 

    [HttpGet] 
    [Route("{buildingId:int}")] // Matches GET api/campus/123/building/456 
    public IActionResult GetBuilding ([FromRoute]int campusId, [FromRoute]int buildingId) { 
     //... validate campus id along with building id 
    }  
} 

Nếu lo ngại về mã lặp đi lặp lại để xác nhận sau đó tạo ra một bộ điều khiển cơ sở cho yêu cầu cơ sở liên quan và có xác nhận chia sẻ phương pháp.

Tùy chọn khác là có dịch vụ/kho lưu trữ có thể được sử dụng để xác minh id trường và mối quan hệ của nó với id tòa nhà được cung cấp nếu cần.

+1

Giải pháp này có ý nghĩa nhất đối với tôi vì toàn bộ mô hình 'khuôn viên 'không cần nằm trong lớp' BuildingController'; thay vì chỉ cần kiểm tra xác thực đơn giản, cần phải được tạo trước. Cảm ơn! –

+0

Tại sao không sử dụng FromRoute thay vì FromQuery? – 000

+0

@Sam 'FromRoute' là chính xác. Tôi vừa sao chép các thông số từ OP. đó là một sự giám sát về phía tôi. Sẽ nâng cấp. Cảm ơn vì chỉ ra điều ấy. – Nkosi

2

Có vẻ như bạn muốn người dùng cung cấp campusId khi nói chuyện với BuildingControllerBuildingController để xác thực campusId theo cách thức DRY.

Nếu đó là trường hợp, bạn có thể tạo ra một mô hình đầu vào cho BuildingController phương pháp của bạn:

public class BuildingIdInput 
{ 
    [Required] 
    public int? CampusId { get; set; } 
    [Required] 
    public int? BuildingId { get; set; } 
} 

Sau đó, bạn có thể cho người dùng nhập vào MVC bám vào mô hình này.

[Route("api/campus")] 
public class BuildingController : Controller 
{ 
    [HttpGet] 
    [Route("{campusId}/building/{buildingId}")] 
    public IActionResult GetBuilding (BuildingIdInput input) 
    { 
     if (ModelState.IsValid) 
     {...} 
    } 
} 
Các vấn đề liên quan