2015-09-03 14 views
17

Tôi đã tạo ra một mô hình MVC tùy chỉnh Binder được gọi cho mỗi HttpPost mà đi vào máy chủ. Nhưng không được gọi cho các yêu cầu HttpGet.Tùy chỉnh mô hình Binder cho ASP.NET MVC trên yêu cầu GET

  • Nếu mô hình tùy chỉnh của tôi có được gọi trong một số GET? Nếu vậy, tôi đã bỏ lỡ những gì?
  • Nếu không, Làm cách nào để viết mã tùy chỉnh xử lý QueryString từ yêu cầu GET?

Dưới đây là thực hiện của tôi ...

public class CustomModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     // This only gets called for POST requests. But I need this code for GET requests. 
    } 
} 

Global.asax

protected void Application_Start() 
{ 
    ModelBinders.Binders.DefaultBinder = new CustomModelBinder(); 
    //... 
} 

Tôi đã nhìn vào các giải pháp này, nhưng họ không hoàn toàn công việc cho những gì tôi tìm kiếm:

  • Loại phức tạp hiện có qua TempData
  • Sử dụng chất kết dính mặc định để xây dựng các loại phức tạp (?Name=John&Surname=Doe)

Ghi chú về câu trả lời

Nhờ @Felipe cho sự giúp đỡ. Chỉ trong trường hợp ai đó đấu tranh với nhau, tôi đã học:

  • Mô hình tùy chỉnh chất kết dính THỂ được sử dụng cho GET yêu cầu
  • Bạn CAN sử dụng DefaultModelBinder lớp
  • trở ngại của tôi là hành động phương pháp PHẢI có thông số (nếu không, trình kết nối mô hình bị bỏ qua cho GET Yêu cầu, có ý nghĩa khi bạn nghĩ về nó)
+0

bạn có thể sử dụng [OnActionExecuting] (https://msdn.microsoft .com/en-us/library/dd493080% 28v = vs.98% 29.aspx) để lọc từng yêu cầu và trong phương thức đó bạn có thể nhận chuỗi truy vấn bằng cách sử dụng 'Yêu cầu'. –

+0

@JSantosh, hãy nói rằng tôi đã làm điều đó và đã giữ của tôi 'QueryString' trong' OnActionExecuting'. Tôi sẽ không thể dịch QueryString thành đối tượng và chuyển nó thành tham số cho phương thức hành động đúng không? Mà lá tôi với tình trạng khó khăn tương tự. –

+0

Trong bài yêu cầu bạn nhận được dữ liệu như là đối tượng được tự động phân tích thành mô hình tương ứng, nhưng trong việc giúp bạn có được dữ liệu như chuỗi, tôi không chắc chắn rằng bạn có thể đạt được điều này. và câu hỏi tốt :) –

Trả lời

18

Hãy giả sử bạn có loại của riêng bạn mà bạn muốn ràng buộc.

public class Person 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int Age { get; set; } 
    // other properties you need 
} 

Bạn có thể tạo một mô hình tùy chỉnh ràng buộc cho loại hình cụ thể này, inherithing từ DefaultModelBinder, cho mẫu:

public class PersonModelBinder : DefaultModelBinder 
{ 
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     var request = controllerContext.HttpContext.Request; 

     int id = Convert.ToInt32(request.QueryString["id"]); 
     string name = request.QueryString["name"]; 
     int age = Convert.ToInt32(request.QueryString["age"]); 
     // other properties 

     return new Person { Id = id, Name = name, Age = age }; 
    } 
} 

Trong Global.asax trong trường hợp Application_Start, bạn có thể registry mô hình này ràng buộc, cho mẫu:

// for Person type, bind with the PersonModelBinder 
ModelBinders.Binders.Add(typeof(Person), new PersonModelBinder()); 

trong phương pháp BindModel từ PersonModelBinder, chắc chắn rằng bạn có tất cả các thông số trong chuỗi truy vấn một d cung cấp cho họ điều trị lý tưởng.

Vì bạn có phương pháp hành động này:

public ActionResult Test(Person person) 
{ 
    // process... 
} 

Bạn có thể truy cập vào hành động này với một cái gì đó url như thế này:

Test?id=7&name=Niels&age=25 
+0

Cảm ơn câu trả lời chi tiết. Tôi đang sử dụng 'DefaultModelBinder' (xem câu hỏi của tôi) và nó dường như không bị trúng trong một yêu cầu ** GET **, chỉ cho ** POST **. Phương thức 'BindModel' của bạn có được gọi cho' HttpGet' không? –

+0

Tôi đã thử nghiệm ở đây và trong phương pháp hành động 'Test' I'v có tham số' person' đầy ok. Đảm bảo bạn đã đăng ký liên kết tùy chỉnh cho loại tùy chỉnh của mình. Hãy nhớ rằng bạn cũng cần phải đọc từ 'request.QueryString'. –

+0

Fantastic, sau đó tôi đã bỏ lỡ một cái gì đó về phía tôi. Hãy để tôi chơi xung quanh và lấy lại cho bạn. Cảm ơn. –

Các vấn đề liên quan