2009-04-03 5 views
7

Özel bir model ciltleyici yazmayı deniyorum, ancak karmaşık bileşik nesnelere nasıl bağlanacağını anlamaya çalışmak çok zor. Karmaşık bileşik nesneler için Özel Model Bağlayıcısı HELP

bu

ben bağlamak çalışıyorum sınıftır:

public class Fund 
{ 
     public int Id { get; set; } 
     public string Name { get; set; } 
     public List<FundAllocation> FundAllocations { get; set; } 
} 

ve bu özel bağlayıcı yazma benim girişimi nasıl gözüktüğü:

public class FundModelBinder : IModelBinder 
{ 
    public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) 
    { 
     throw new NotImplementedException(); 
    } 

    public object GetValue(ControllerContext controllerContext, string modelName, Type modelType, ModelStateDictionary modelState) 
    { 
     var fund = new Fund(); 

     fund.Id = int.Parse(controllerContext.HttpContext.Request.Form["Id"]); 
     fund.Name = controllerContext.HttpContext.Request.Form["Name"]; 

     //i don't know how to bind to the list property :(
     fund.FundItems[0].Catalogue.Id = controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"]; 
     return fund; 
    } 
} 

Herhangi Fikirler

teşekkürler Tony

+0

Sadece bir soru yayınladım ve daha sonra aynı türden bir soruna çözüm buldum. İlgilenenler için aşağıdaki linke göz atmak isteyebilirsiniz: [http://stackoverflow.com/questions/1077481/how-do-i-pass-a-dictionary-as-a-parameter-to-an-actionresult kullanılan yöntem-den-jquery-a] (http://stackoverflow.com/questions/1077481/how-do-i-pass-a-dictionary-as-a-parameter-to-an-actionresult-method-from- jquery-a) –

cevap

3

Bu kadar çok fazla harcama yapıyorum son zamanlarda ame şey!

HTML formunuzu görmeden, seçim sonuçlarını çoktan seçmeli bir listeden mi aldığımı tahmin ediyorum. Öyleyse, formunuz hidratlanmış FundAllocations nesnesini döndürmek yerine bir sürü tam sayı döndürüyor. Bunu yapmak istiyorsanız, özel ModelBinder'ınızda kendi aramanızı yapmanız ve nesneyi kendiniz hiddet etmeniz gerekecektir. gibi

şey: Tabii

fund.FundAllocations = 
     repository.Where(f => 
     controllerContext.HttpContext.Request.Form["FundItem.Catalogue.Id"].Contains(f.Id.ToString()); 

, benim LINQ sadece örneğin olduğunu ve açıkçası istediğiniz sonuçta O verileri alabilir. Bu arada, bu sorunun cevabını vermediğini biliyorum. Fakat karmaşık nesneler için, bir ViewModel kullanmanın ve varsayılan ModelBinder'ın buna en iyi şekilde sahip olduğuma karar verdim. Benim varlığımı temsil eden model. Bunu en iyi seçim haline getiren bir dizi sorun var, şimdi onlarla uğraşmayacağım ama isterseniz tahmin etmekten mutluluk duyuyorum.

En son Herding Code podcast, K Scott Allen's Putting the M in MVC blog posts gibi büyük bir tartışmadır.

8

Burada özel bir ModelBinder uygulamanız gerekiyor mu? Varsayılan bağlayıcı (bu koleksiyonları ve karmaşık nesneleri doldurmak gibi) ne gerek yapabilirsiniz:

Denetleyiciniz eylem şöyle düşünelim:

public ActionResult SomeAction(Fund fund) 
{ 
    //do some stuff 
    return View(); 
} 

Ve html bu içerir:

<input type="text" name="fund.Id" value="1" /> 
<input type="text" name="fund.Name" value="SomeName" /> 

<input type="text" name="fund.FundAllocations.Index" value="0" /> 
<input type="text" name="fund.FundAllocations[0].SomeProperty" value="abc" /> 

<input type="text" name="fund.FundAllocations.Index" value="1" /> 
<input type="text" name="fund.FundAllocations[1].SomeProperty" value="xyz" /> 

Varsayılan model bağlayıcı, fon nesnesini FundAllocations List'te 2 öğe ile başlatmalıdır (FundAllocation sınıfınızın neye benzediğini bilmiyorum, bu yüzden tek bir özellik "SomeProperty" oluşturdum). Sadece bu "fund.FundAllocations.Index" öğelerini eklediğinizden emin olun (varsayılan bağlayıcı, kendi kullanımı için bakar), bu çalışmayı denediğimde beni yakaladı).

+0

JonoW - Standart model ciltleyici için iyi bir dokümantasyon bağlantınız var mı, yoksa sadece kaynağa mı baktınız? –

+0

Üzgünüm, herhangi bir resmi belgelerin bağlantısı yok mu, benzer bir sorunla karşılaştığım gibi, Phil Haack'in tavsiyesiyle gerçekten ilgileniyordum - http://haacked.com/archive/2008/10 /23/model-binding-to-a-list.aspx. Bunu yapmanın daha iyi bir yolu olabilir 1.0, emin değilsiniz ... – JonoW

+0

Doğru, özel bir model bağlayıcıya ihtiyacınız yok. Yukarıda gösterildiği gibi ad alanını işleyerek bunu yapabilirsiniz. – MedicineMan