2008-11-27 36 views

cevap

12

Bu tam Request.QueryString modifiye aynıdır. Her ikisi de özel mülkler tarafından karmaşıktır ve bir hata olarak kabul edilebilir, ancak farkında olduğum iki olası çözüm vardır (response.redirect planını elden çıkaracağım - bu korkunç).

NameValueCollection oQuery = Request.QueryString; 
oQuery = (NameValueCollection)Request.GetType().GetField("_queryString",BindingFlags.NonPublic | BindingFlags.Instance).GetValue(Request); 
PropertyInfo oReadable = oQuery .GetType().GetProperty("IsReadOnly", BindingFlags.NonPublic | BindingFlags.Instance); 
oReadable.SetValue(oQuery, false, null); 
oQuery["foo"] = "bar"; 
oReadable.SetValue(oQuery, true, null); 

B Planı, ben daha iyi birim test için oldukça rahat doğrudan koleksiyonu ile ilgili önlemek ve bunun yerine bir NameValueCollection olarak geçmek olduğunu düşünüyorum:

Birinci yöntem, doğrudan koleksiyonu değiştirmek için yansıma kullanmaktır işlemek istediğiniz herhangi bir yönteme, ihtiyacınız olan her şeye sığ kopyalama. Web isteklerini dalgalandırmak için bunu kendim kullandım.

Düzenleme: hayır önerilen bir şeyi ifade ve (~ = pahasına) mümkün olduğunca kaçınılmalıdır tarafından Marc Gravell bu şekilde özel şeyler kurgulama B planı

+1

için daha anlamlı nedenler verdiğim. Ne de olsa bir sebepten dolayı özel hale getiriliyorlar. Bir kütüphanenin belirli bir versiyonuna güvenirsiniz. Temel uygulamadaki herhangi bir değişiklik uygulamanızı bozabilir. –

+0

Ve görürsünüz Plan B – annakata

+0

Plan A savunmasız bir şey detayı. Bence doğru yol değil. Kendiniz test edebilirsiniz. –

2

Form, istemcinin istekte ne gönderdiğinin bir temsilidir. Ne yapmak istiyorsun? Şahsen, "formu oku" kodunu "değerler ile bir şey yap" kodundan ayırmaya çalışacağım - bu şekilde, ön işleme işlemini erken yapabilir (formdan okurken) ve daha sonra kodun, 'un aslında nolu gönderilme şeklini bilmesi gerekir - sadece verilen değerleri alır (yani hiçbir zaman doğrudan isteğiyle konuşmaz).

Ayrıca mantığınızı bir forma veya hatta bir http isteğine ihtiyaç duymadan da test edebileceğiniz anlamına gelir.

Aslında ASP.NET MVC sizin için bir sürü (yukarıdaki paragraf) ... Eğer .items koleksiyonu güncelleyebilirsiniz

Not yapacak - ama bu biraz daha belirsiz (yani onu özellikle form ile ilgili değildir).

(btw yazım hatası sabitlemek için alkış)

İlgili konular