2009-12-24 15 views
9

MVC 1 projemi MVC 2 RC'ye yükseltmeye çalışıyorum. Şu anda ValueProvider'a öğe ekleyen özel bir model oluşturucu var (bu, bir sözlük olduğunda işe yaradı). Daha sonra bunu varsayılan model oluşturucusuna aktardık. Bununla birlikte, IValueProvider'ın bir ekleme yöntemi yoktur, bu nedenle bu algoritma artık çalışmaz. Herkes, MVC 2'de ValueProvider'a değer eklemenin bir yolunu biliyor mu?ASP.NET MVC 2 - Değerleri ayarlama IValueProvider

foreach(string valKey in controllerContext.RequestContext.HttpContext.Request.Form.AllKeys.Where(x => x.StartsWith(valuesToChangePrefix))) 
{ 
    string valName = valKey.Substring(valuesToChangePrefix.Length); 

    string myVal = ManipulateValue(bindingContext.ValueProvider.GetValue(valKey).AttemptedValue); 

    // This is where I need to add to my value Provider (As you can see I used to just assign a ValueProviderResult 
    //bindingContext.ValueProvider = new ValueProviderResult(myVal.Split(','), myVal, bindingContext.ValueProvider.GetValue(valKey).Culture); 
} 
+2

Aynı anda şu anda, MVC2 için özel model bağlayıcıların nasıl uygulanacağı konusunda herhangi bir uygun belge bulamıyorum. –

cevap

2

sorun ModelBinder almak saate göre ValueProvider zaten ayarlanmış olmasıdır ... Ya yardımcı emin değilim. Önceden, bu noktada ValueProvider'ınıza değerler ekleyebilirsiniz.

Özel bir ValueProvider sağlamak için, en iyi çözüm olan ControllerActionInvoker'ı geçersiz kılmanız gerekir. Ne yazık ki ControllerActionInvoker, enjekte edilmek yerine Controller nesnesi tarafından oluşturulur. Bu nedenle, kendi ControllerActionInvoker'ınızı çağırmak için Denetleyiciyi geçersiz kılmanız gerekir.

+2

Aslında daha kolay bir çözüm var gibi görünüyor. Kendi ValueProvider'ınızı kolayca oluşturabilir ve Application_Start'taki statik ValueProviderFactories.Factories koleksiyonuna ekleyebilirsiniz. –

0

Türetilmiş türden IValueProvider türlerinden birini kullanamaz mısınız? (veya kendi başınıza yaratın, ancak çerçeve içinde iyi uygulamalar var gibi görünüyor)

ValueProviderDictionary. ValueProviderCollection, FormCollection (ve birkaç tane daha) hepsi IValueProvider uygular.

Yardımcı olup olmadığından emin değilim. Ne yapmaya çalıştığın konusunda emin değilim. Posta paramlarıyla çok fazla uğraşmak zorunda kalmam.

+0

Türetilmiş bir tür IValueProvider kullanabilirsiniz, ancak bunu boru hattına bağlamanız gerekir. –

+0

İlk ikisi kullanımdan kaldırıldı. – Martin

+0

MSDN sayfası, "ValueProviderDictionary" öğesinin kullanımdan kaldırıldığını, ancak "ValueProviderCollection" ifadesinin nerede olduğunu görmediğini söylüyor mu? – Funka

0

Muhtemelen yanlış anladım, ancak bu önekini kullanıyorsunuz? Bu, modelinizin çocuk ilişkisi ile ilgili mi?

Değilse, neden DefaultModelBinder'dan türetilmiyor ve BindModel() yöntemini geçersiz kılıyorsunuz? Bu şekilde base.BindModel() numaralı telefonu arayabilir ve daha sonra değerleri değiştirebilirsiniz, ancak daha sonra model doğrulamasını kullanamazsınız (http://bradwilson.typepad.com/blog/2010/01/input-validation-vs-model-validation-in-aspnet-mvc.html'u okuduğunuzdan emin olun, çünkü RC'de sürümde önemli bir değişiklik olacaktır).

Temizleyici yaklaşım, yapmayı denediğimi tahmin edebildiğim noktadan, bu durumda bir ViewModel kullanmaktır. Manipülasyon muhtemelen önemsiz olduğundan, giriş ve model doğrulamalarını birbirinden ayırmak isteyebilirsiniz.

bu

+0

Temel olarak, belirli bir öneki olan değerlerin şifresini çözmeye çalışıyorum. ViewModel'lerin şifre çözmeyi bilmemesi için bunu yapmaya çalışıyoruz - sadece bir int var ve onlara ulaştığı zaman şifresi çözüldü. Yani, bu sorunu çözmez. –