2015-09-03 21 views
17

Sunucuya gelen her HttpPost için çağrılan özel bir MVC Model Binder oluşturdum. Ancak HttpGet istekleri için çağrılmadı. Özel Model Binder ASP.NET MVC GET isteği üzerine

  • benim özel modeli bağlayıcı bir GET sırasında denilen olsun mıdır? Eğer öyleyse, neyi özledim?
  • Değilse, QueryString numaralı özel kod işleyişini bir GET isteğinden nasıl yazabilirim? İşte

... Global.asax

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

ben bu çözümlerin içine baktım

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. 
    } 
} 

benim uygulaması var, ama onlar ben ne için oldukça işi arıyor:

  • ile kalıcı karmaşık türleri Yardım için @Felipe için

    sayesinde karmaşık türleri (?Name=John&Surname=Doe) Yanıta

Aciklama oluşturmak için varsayılan bağlayıcı kullanılması
  • . Her ihtimale karşı birisi aynı boğuşan, ben öğrendim: Bağlayıcı GET istekleri
  • Sen CAN kullanım DefaultModelBinder sınıf için kullanılacak CAN özel model
  • Benim engelle
    • olduğunu eylem yöntem parametresine sahip OLMALIDIR (aksi taktirde, model binder,
  • +0

    sen [OnActionExecuting] kullanabilirsiniz (https://msdn.microsoft .com/en-us/library/dd493080% 28v = vs.98% 29.aspx) her isteği filtrelemek ve bu metotta 'Request' kullanarak sorgu dizisi alabilirsiniz. –

    +0

    @JSantosh, bunu yaptım ve 'QueryString'imi' OnActionExecuting' içinde tuttum diyelim. QueryString'i bir nesneye dönüştürebilir ve bunu eylem yöntemine bir parametre olarak iletemezdim? Bu da beni aynı güçlükle terk ediyor. –

    +0

    İstek üzerine, veriyi otomatik olarak ilgili modele ayrıştırılmış bir nesne olarak alırsınız, ancak veriyi string olarak aldığınızda, bunu başarabileceğinden emin değilim. ve iyi bir soru :) –

    cevap

    18

    Diyelim ki, bağlamak istediğiniz kendi tipiniz var.

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

    Sen numune için, DefaultModelBinder gelen inherithing, bu özel türü için özel bir modeli bağlama oluşturabilir:

    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 }; 
        } 
    } 
    

    Global.asax içinde Application_Start durumunda, bu modelin bağlama defteri edebilir, numune için: PersonModelBinder den BindModel yöntemde

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

    , sen sorgu dizesi bir in tüm parametreleri olduğundan emin olun Onlara ideal tedaviyi verin.

    bu işlemin yöntemi olduğundan: Bu gibi bir url şey ile bu eylemi erişebilir

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

    :

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

    Detaylı cevap için teşekkürler. 'DefaultModelBinder' kullanıyorum (soruma bakın) ve bir ** GET ** isteği sırasında vurulmuyor gibi görünüyor, sadece ** POST ** için. 'BindModel' yönteminiz bir' HttpGet' için de çağrılır mı? –

    +0

    Burada test ettim ve 'Test 'eylem metodunda' person' parametresi tamamlandı. Özel türünüz için özel bağlama kaydettiğinizden emin olun. Ayrıca şunu da unutmayın: 'request.QueryString' den okumalısınız. –

    +0

    Fantastik, o zaman yanımda bir şey özledim. Etrafta oynamama ve sana geri dönmeme izin ver. Teşekkürler. –

    İlgili konular