不再為頻繁的QueryString解析而苦惱

2021-04-21 04:42:19 字數 2236 閱讀 8856

在做asp.net開發的時候,很多人都對頻繁地解析querystring中的值而苦惱,因為會在幾乎每個頁面上編寫相似的**將位址中的引數轉換為相應的值。假設有乙個頁面用來顯示文章的內容,並且需要由querystring中的id引數提供文章的id,請參考以下**:

string arg;

guid aritcleid;

arg = request.querystring["id"];

if (!string.isnullorempty(arg))

catch 

}if (articleid != guid.empty)

else

看看,僅解析乙個id就要這麼多的**,如果引數多,或者在很多頁面上都要做相同的事情就會顯得很麻煩。我在自己的工作過程中有這樣的體會,非常不爽,為了提高工作效率,我自己寫了乙個類來簡化這方面工作,以期望達到簡化工作量和**量的目的。先來看看使用案例,將以上**轉換為新的方式:

// 宣告乙個保護級別的字段用來存放解析後的值。

[querystring("id")]

protected guid articleid;

protected

void page_load(object sender, eventargs e)

兩段程式相比,後者只需要宣告乙個字段,再有一行解析語句就可以了,簡化了許多任務作。假如果引數的個數多,這種差別會更明顯。好了,下面說說這個querystringattribute類的原理了。

其實原理並沒有想象的那麼複雜,簡單的說,就是通過反射取出頁面上定義了querystringattribute的所有字段,再比對querystringattribute中指定的引數名字,把字串轉換為相應的值就可以了。要取出頁面上字義的字段,可以用type.getfields()方法先取出所有的字段,再依次檢測它們是否有定義了querystringattribute即可,**如下:

querystringattribute qa;

type type = page.gettype();

// 首先取出頁面上定義的所有字段

fieldinfo fields = type.getfields(bindingflags.instance | bindingflags.public | bindingflags.nonpublic);

// 再通過乙個迴圈來測試每個字段是否定義了querystringattribute。

foreach (fieldinfo field in fields)}

上面這段**中,變數qa就是在字段上定義的querystringattribute型別的例項。例項中有乙個非常重要的屬就,就是name,它用來指示這個字段對應到querystring中的哪個引數。因為在建立querystringattribute物件例項的時候已經指定name屬性,因此就可以用它來找到querystring中的引數,並賦值給字段,可參考上述第一段**中的形式。不過有一點必須考慮的是,此時並不知道從文字轉換為具體的型別需要用哪種方式,guid可以採用上述的辦法,但其它諸如int, datetime等型別就無從下手了。這裡我採用的是用system.componentmodel.typeconverter來轉換值型別,**如下:

public

static

object converttype(string text, type valuetype)

」轉換為型別,是否查詢項名稱是否正確,或者缺少型別轉換器的定義。",

text, valuetype.assemblyqualifiedname));

v = converter.convertfrominvariantstring(text);

return v;}

接下來的一項工作,就是要把轉換後的值賦給相應的字段,這太簡單不過了,使用fieldinfo.setfield()方法一行搞定。這樣,整個querystringattribute的原理就介紹完了。

使用querystringattribute雖然可以簡單化程式,但它也會有負面的影響和使用限制。由於採用了反射機制,就會導致程式的效能下降,這是眾所周知的。另外,對於**隱藏的aspx頁面,實際執行時的page物件的型別不是.cs檔案中定義的那個類,而是乙個自動生成的派生類,因此,必須將字段宣告為protected才能被反射找到。

以上只是介紹了這個功能實現的主要原理,當然為了提高querystringattribute的可用性,我還增加了一些其它的特性,例如可以設定引數是否可選,當引數為必選並且沒有指定引數值時,引發異常。另外在沒有提供引數的情況下,還會檢測是否在字段上定義了預設值等等,在這裡就不一一詳述。

不再為失眠而憂慮

如果你經常沒有辦法入睡。那是因為你 說 得讓自己得了失眠症。如果你睡眠不好的話,那你一定很憂慮吧?然而你也許不知道。我們的一生有三分之一花在睡眠上,可是沒人知道睡眠究竟是怎麼回事。我們只知道睡覺是一種習慣,是一種休息狀態。但我們不清楚每個人需要幾個小時的睡眠,更不清楚我們是不是非要睡覺不可。所以,不...

原諒我不再為你執筆

縱使,風輕輕地吹,仍舊趕不走夏日的酷暑 可,原本如烈日般火熱的心,卻滿滿的都是冰涼,再也等不到你的回眸,再也盼不到你的嫣然一笑。時光不冷不暖,悄悄地,在天空姣好的臉龐上劃滿傷痕,雨滴打落最後一片花瓣,我的身體哆嗦著,我的手顫抖著 再暖的陽光也暖不了我指尖的低溫,和心靈深處對你最徹底的絕望。往事如風,...

動態生成form表單,不再為表單煩惱

具有資料收集 校驗和提交功能的表單生成器,支援雙向資料繫結和事件擴充套件,元件包含有核取方塊 單選框 輸入框 下拉選擇框等表單元素以及省市區 聯動,時間選擇,日期選擇,顏色選擇,滑塊,評分,框架,樹型,檔案 上傳等功能元件。github gitee 圖例 demo npm install form ...