<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        動態指定任意類型的ObjectDataSource對象的查詢參數

        來源:懂視網 責編:小采 時間:2020-11-27 22:43:48
        文檔

        動態指定任意類型的ObjectDataSource對象的查詢參數

        動態指定任意類型的ObjectDataSource對象的查詢參數:ObjectDataSource在使用時需要事先指定查詢方法SelectMethod(其實還有InsertMethod,UpdateMethod和DeleteMethod),TypeName和DataObjectTypeName,然后我們只需要編寫好SelectMethod方法的實現,如果需要分頁,那么還要指定MaximumRw
        推薦度:
        導讀動態指定任意類型的ObjectDataSource對象的查詢參數:ObjectDataSource在使用時需要事先指定查詢方法SelectMethod(其實還有InsertMethod,UpdateMethod和DeleteMethod),TypeName和DataObjectTypeName,然后我們只需要編寫好SelectMethod方法的實現,如果需要分頁,那么還要指定MaximumRw

        ObjectDataSource在使用時需要事先指定查詢方法SelectMethod(其實還有InsertMethod,UpdateMethod和DeleteMethod),TypeName和DataObjectTypeName,然后我們只需要編寫好SelectMethod方法的實現,如果需要分頁,那么還要指定MaximumRwosParameterName屬性和StartRowIndexParameterName,然后在SelectMethod方法中加上相應的參數,當然,SelectCountMethod屬性也是要指定的,并且參數簽名必須和SelectMethod方法的參數簽名相同。這些我在前面那篇文章中都有詳細的介紹。這里我想說一下如何動態指定ObjectDataSource對象的查詢參數,例如我們使用ObjectDataSource對象來綁定ListView數據源,一般查詢參數都是事先通過SelectParameter確定好并傳入給ObjectDataSource的,如果我們想實現根據用戶選擇的條件進行查詢,在頁面回傳的時候將查詢條件傳遞給ObectDataSource對象,并且允許隨意指定查詢參數的數據類型,怎么實現呢?

          其實ObjectDataSource參數是可以指定查詢參數的,它有很多種不同類型的查詢參數,如ControlParameter,CookieParameter,FormParameter,ProfileParameter,QueryStringParameter,SessionParameter等。由于不能在ObjectDataSource的SelectMethod方法中引入頁面元素,如文本框的值,下拉列表的值,這是因為ObjectDataSource在初始化并指定SelectMethod方法時頁面上的其它元素還沒有完成初始化,此時引用頁面上的這些元素將會引發空引用的異常。正確的方法是通過ObjectDataSource的查詢參數來解決此類問題,如我們可以使用QueryStringParameter通過頁面的url來傳遞參數,還可以使用CookieParameter通過客戶端的Cookie傳遞參數,使用SessionParameter通過服務端的Session來傳遞參數。不過這些參數都有問題,QueryStringParameter只能傳遞字符串類型的參數,復雜類型的參數很難實現;CookieParameter收到客戶端Cookie的限制,也不太理想;SessionParameter有些夸張,我不能因為用戶想完成一次簡單的查詢操作就在服務器上存放一大堆Session吧?

          看來使用ControlParameter是比較理想的,畢竟用戶都是通過頁面上的控件來指定查詢條件的,而程序也正是通過頁面上的控件才得到用戶所指定的查詢條件的,這個是比較符合邏輯的。下面我們就來看看如何通過ControlParameter來實現ObjectDataSource的查詢參數動態指定。
        代碼如下:


        <asp:ObjectDataSource ID="DataSource" runat="server" SelectMethod="SelectDatas"
        TypeName="MilitaryShopWeb.Admin.SystemConfig.SysLog" DataObjectTypeName="MilitaryShopModel.Log" EnablePaging="True"
        MaximumRowsParameterName="maxRows" StartRowIndexParameterName="startIndex" SelectCountMethod="CountAll" DeleteMethod="DeleteData">
        <SelectParameters>
        <asp:ControlParameter ControlID="ddlCate" PropertyName="SelectedValue" Name="cate" />
        <asp:ControlParameter ControlID="ddlArea" PropertyName="SelectedValue" Name="area" />
        <asp:ControlParameter ControlID="tbBeginTime" PropertyName="Text" Name="begintime" />
        <asp:ControlParameter ControlID="tbEndTime" PropertyName="Text" Name="endtime" />
        </SelectParameters>
        </asp:ObjectDataSource>

          給定的代碼不是完整的代碼,因為我在例子中使用的NHibernate作為數據持久層,這樣我不太方便講整個可執行代碼都貼出來,還望大家能諒解!不過從上面的代碼中可以看出,我們可以直接在ObjectDataSource的標記中引入SelectParameters參數列表,將要作為查詢參數的控件依次通過ControlParameter標記給出。其中ControlID為指定的控件ID,PropertyName為控件取值的屬性名稱,Name為參數名稱,這個與SelectMethod中的查詢參數簽名相對應。

          下面是服務端代碼。這里順便給出了DeleteMethod方法的實現,代碼中引入了其它的類庫,讀者只需看明白其中的道理即可!
        代碼如下:


        public List<Log> SelectDatas(int startIndex, int maxRows, string cate, string area, string begintime, string endtime)
        {
        int itemCount;
        int pageIndex = 1;
        if (startIndex > 0)
        {
        pageIndex = (startIndex) / PageSize + 1;
        }

        LogBll bll = new LogBll();
        List<ICriterion> query = new List<ICriterion>();
        ICriterion[] expression = null;
        if (cate != "-1")
        {
        query.Add(Restrictions.Eq("Logtype", cate));
        }
        if (area != "-1")
        {
        query.Add(Restrictions.Eq("Applicationarea", area));
        }
        if (begintime != null && begintime.Trim().Length > 0)
        {
        query.Add(Restrictions.Ge("Logtime", DateTime.Parse(begintime.Trim())));
        }
        if (endtime != null && endtime.Trim().Length > 0)
        {
        query.Add(Restrictions.Le("Logtime", DateTime.Parse(endtime.Trim())));
        }

        if (query.Count > 0)
        {
        expression = query.ToArray();
        }

        try
        {
        List<Log> list = bll.GetProducts(expression, pageIndex, maxRows, out itemCount);
        ViewState["ITEMCOUNT"] = itemCount;
        return list;
        }
        catch (Exception ex)
        {
        Log log = new Log(LogType.Error.ToString(), ex.Message, DateTime.Now, ApplicationArea.SysLogManage.ToString(), ex.StackTrace);
        ApplicationLog.Write(log);
        }

        return null;
        }

        public static void DeleteData(Log obj)
        {
        try
        {
        LogBll bll = new LogBll();
        bll.Delete(obj.Id);
        ScriptHelper.ShowMessage("刪除成功!");
        }
        catch (Exception ex)
        {
        Log log = new Log(LogType.Error.ToString(), ex.Message, DateTime.Now, ApplicationArea.ProductCategoriesList.ToString(), ex.StackTrace);
        ApplicationLog.Write(log);
        ScriptHelper.ShowMessage("刪除失敗!請查看數據庫日志以確定失敗原因。");
        }
        }

        public int CountAll(string cate, string area, string begintime, string endtime)
        {
        return Convert.ToInt32(ViewState["ITEMCOUNT"] ?? 0);
        }

          CountAll的參數簽名必須和SelectDatas的參數簽名相同。在這里,查詢參數的數據類型是NHibernate的ICriterion數組,在SelectDatas中首先會判斷指定控件的值是否為空,不為空則構建ICriterion查詢數組,然后將參數傳遞給底層代碼進行數據查詢。在這里沒有直接引用頁面上的控件,而是通過查詢參數來獲取的值。這樣,當用戶指定查詢或者查看全部數據時,我們幾乎不用做任何事情。
        代碼如下:


        private void RefreshData()
        {
        lvList.DataSourceID = DataSource.ID;
        }

        protected void btDoQuery_Click(object sender, EventArgs e)
        {
        RefreshData();
        }

        protected void btAll_Click(object sender, EventArgs e)
        {
        this.ddlArea.SelectedValue = "-1";
        this.ddlCate.SelectedValue = "-1";
        this.tbBeginTime.Text = string.Empty;
        this.tbEndTime.Text = string.Empty;
        RefreshData();
        }

          RefreshData方法只是將ListView的數據源重新指向ObjectDataSource,以實現數據綁定的“刷新”效果。btDoQuery_Click只需要執行一下RefreshData方法即可,因為頁面上控件的值已經通過ControlParameter查詢參數傳遞給ObjectDataSource了,我們沒有其它的東西需要處理。別忘了!服務器端控件的值在默認情況下是可以回傳的。btAll_Click是查詢全部數據,此時我們只需要將控件中的值清空,然后重新執行RefreshData方法即可。

          是不是很簡單啊?其實ObjectDataSource控件的功能還是很強大的,以后綁定頁面數據,尤其是帶有分頁效果時建議多用ObjectDataSource控件,它可以節省很多的開發時間。

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        動態指定任意類型的ObjectDataSource對象的查詢參數

        動態指定任意類型的ObjectDataSource對象的查詢參數:ObjectDataSource在使用時需要事先指定查詢方法SelectMethod(其實還有InsertMethod,UpdateMethod和DeleteMethod),TypeName和DataObjectTypeName,然后我們只需要編寫好SelectMethod方法的實現,如果需要分頁,那么還要指定MaximumRw
        推薦度:
        標簽: 動態 類型的 參數
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 亚洲色图.com| 久久99亚洲网美利坚合众国| 亚洲免费视频观看| a级毛片免费在线观看| 国产午夜亚洲精品理论片不卡| 羞羞漫画登录页面免费| 国产jizzjizz免费看jizz| 亚洲heyzo专区无码综合| 国产免费私拍一区二区三区| 亚洲av片在线观看| 亚洲A∨精品一区二区三区| 乱爱性全过程免费视频| 亚洲自偷自偷偷色无码中文| 十八禁在线观看视频播放免费| 国产v亚洲v天堂无码网站| 99精品免费观看| 波多野结衣亚洲一级| 国产麻豆剧传媒精品国产免费| 人人爽人人爽人人片A免费| 曰韩亚洲av人人夜夜澡人人爽 | 免费毛片在线播放| 蜜芽亚洲av无码一区二区三区| 亚洲国产香蕉人人爽成AV片久久 | 一区二区三区无码视频免费福利 | 国产亚洲精品bv在线观看| 最好免费观看韩国+日本| 杨幂最新免费特级毛片| 国产偷v国产偷v亚洲高清| 91精品全国免费观看含羞草| 亚洲色成人网站WWW永久四虎 | 污视频网站在线观看免费| 亚洲女久久久噜噜噜熟女| 久久久久久精品免费看SSS| 亚洲国产精品无码久久久秋霞1 | 亚洲a一级免费视频| 色影音免费色资源| 一区二区3区免费视频| 亚洲最大黄色网址| 亚洲欧洲精品成人久久奇米网| 91久久精品国产免费一区| 亚洲色大18成人网站WWW在线播放 亚洲色大成WWW亚洲女子 |