6

Chúng tôi có một số ứng dụng PHP và Javascript gọi vào một số điểm cuối ASP.NET MVC. Hãy nói rằng chúng tôi có thiết bị đầu cuối này:Cách ánh xạ 1 hoặc 0 trong phân đoạn tuyến ASP.Net MVC thành tham số đầu vào phương thức hành động Boolean

public ActionResult DoSomething(bool flag) 
{ 

} 

Tôi muốn nó để phù hợp với giá trị cho cờ liệu tôi vượt qua trong một số nguyên trong tổng số 1 hoặc 0, hoặc vượt qua trong một chuỗi các "true" hoặc "false". Tôi cần thực hiện một phần nào của khung công tác để phù hợp với điều đó?

+0

bạn muốn tạo tuyến đường tùy chỉnh. 2 hoặc 3 người trong số họ. Thêm một số URL mẫu để làm việc. Cũng giải thích nếu những điểm kết thúc này sẽ thay đổi ở tất cả các tuyến đường tiêu chuẩn của bạn. Nếu họ làm (bắt đầu với một cái gì đó như bool) sẽ tốt hơn. –

Trả lời

0

Tôi cần thực hiện một phần khung công tác nào để phù hợp với điều đó?

Tùy chỉnh model binder.

+0

sẽ làm điều đó –

0

Bạn có thể sử dụng một mô hình tùy chỉnh chất kết dính, như được tìm thấy trong câu hỏi này SO ASP.NET MVC controller actions with custom parameter conversion?

Bây giờ nếu bạn muốn thực hiện điều này trên toàn cầu, do đó bạn không cần phải thiết lập một thuộc tính trên mỗi bool mà có thể có được một 0/1 thay vì true/false, khi đó bạn có thể mở rộng trình mô hình mặc định để hiểu 0 hoặc 1 là false hoặc true bằng cách ghi đè trình kết nối mô hình mặc định, như được tìm thấy trong câu hỏi SO này Change the default model binder in asp.net MVC

Một số kết hợp cả hai sẽ giúp bạn bạn muốn gì.

7

Cách tốt nhất để làm điều này là sử dụng nhà cung cấp giá trị tùy chỉnh. Mặc dù bạn có thể thực hiện việc này bằng cách sử dụng một trình kết nối mô hình tùy chỉnh hoàn chỉnh, nhưng đó là quá mức cần thiết dựa trên yêu cầu của bạn và dễ dàng hơn nhiều khi triển khai nhà cung cấp giá trị tùy chỉnh.

Để biết một số hướng dẫn về thời điểm bạn sử dụng chất kết dính mô hình tùy chỉnh và thời điểm sử dụng nhà cung cấp giá trị tùy chỉnh, hãy xem herehere.

Bạn chỉ có thể tạo nhà cung cấp giá trị tùy chỉnh để xử lý các giá trị tuyến đường có khóa "gắn cờ" và xử lý chuyển đổi int thành bool trong nhà cung cấp giá trị. Các mã để làm điều này trông giống như sau:

public class IntToBoolValueProvider : IValueProvider 
{ 
    public IntToBoolValueProvider(ControllerContext context) 
    { 
     if (context == null) 
      throw new ArgumentNullException("context"); 

     this._context = context; 
    } 
    public bool ContainsPrefix(string prefix) 
    { 
     return prefix.ToLower().IndexOf("flag") > -1; 
    } 
    public ValueProviderResult GetValue(string key) 
    { 
     if (ContainsPrefix(key)) 
     { 
      int value = 0; 
      int.TryParse(_context.RouteData.Values[key].ToString(), out value); 
      bool result = value > 0; 
      return new ValueProviderResult(result, result.ToString(), CultureInfo.InvariantCulture); 
     } 
     else 
     { 
      return null; 
     } 
    } 
    ControllerContext _context; 
} 

public class IntToBoolValueProviderFactory : ValueProviderFactory 
{ 
    public override IValueProvider GetValueProvider(ControllerContext controllerContext) 
    { 
     return new IntToBoolValueProvider(controllerContext); 
    } 
} 

Trong các nhà cung cấp giá trị, bạn thực hiện các phương pháp ContainsPrefix để trở về đúng cho các phím giá trị con đường bạn đang quan tâm, trong trường hợp này là chìa khóa "cờ". Trong cờ GetValue, bạn chuyển đổi giá trị của mục nhập dữ liệu tuyến "cờ" thành một int, và sau đó thành một boolean, tùy thuộc vào nếu int lớn hơn 0. Đối với tất cả các khóa dữ liệu tuyến đường khác không phải là "cờ", bạn chỉ trả lại giá trị rỗng, cho biết khung MVC bỏ qua ValueProvider này và chuyển sang các nhà cung cấp giá trị khác.

Để thực hiện điều này, bạn cần triển khai lớp con ValueProviderFactory để tạo nhà cung cấp IntToBoolValueProvider tùy chỉnh. Ngoài ra, bạn cần phải đăng ký nhà máy này với khung MVC. Bạn làm điều này trong toàn cầu.tuyến Asax sử dụng ValueProviderFactories lớp tĩnh:

protected void Application_Start() 
{ 
    ValueProviderFactories.Factories.Insert(0, new IntToBoolValueProviderFactory()); 
} 

Nếu bạn sau đó có một con đường thiết lập như sau:

routes.MapRoute("", "{controller}/foo/{flag}", new { action = "Foo" }); 

tuyến đường này sẽ trực tiếp yêu cầu tới

http://localhost:60286/Home/Foo/{flag} 

với phương pháp hành động

public ActionResult Foo(bool flag) 
    { 
     //Implement action method 
     return View("Index"); 
    } 

Khi nào phân đoạn {flag} lớn hơn 0, thông số đầu vào cờ bool sẽ là true và khi nó bằng 0, tham số cờ sẽ là false.

Thông tin thêm về nhà cung cấp giá trị tùy chỉnh MVC có thể được tìm thấy here.

+0

Sử dụng nhà cung cấp giá trị tùy chỉnh là cách sửa lỗi, câu trả lời sẽ được đánh dấu là được chấp nhận. –