星星之火

燎原之势不可挡
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

2013-5-4

如何验证DropDownList是否已选择

     上周在项目开发中遇到这样一个问题,在做基础数据管理时,需要进行数据的新增和修改,在Editor页上有一个表单字段的内容是从DropDownList里边选的,DropDownList默认的选项为“请选择”,如何在客户端对用户是否选择进行校验?

     因为是基础数据管理,所以对整个性能的要求不是特别的严格,整个表单的验证都是使用的ASP.NET里边的验证控件,因为DropDownList有默认的选择项为“请选择”,所以就算用户什么都不选,DropDownList也会有值,不能用RequiredFieldValidator(必须字段验证)验证,这里用的是RegularExpressionValidator(正则表达式验证) 正则表达式验证控件。

     接着问题又来了,如何写这样的一个正则表达式呢?在网上看了一些关于匹配中文字符串的正则,但是在做测试的时候发现都不是很好用,有时候还检测不出来。然后就又对要选择的表单字段的内容进行了分析,该表单的内容除了默认的“请选择”这一项为中文外,其他的均为“.字母”这样的形式。所以就有了以下两种思路。

1)       验证起始字符为不为“请”

对应的正则:^[^请]+

2)       验证字符串格式为“.字符”

对应的正则:\.[A-Z,a-Z]+

      以上两种方法均很好的解决验证DropDownList是否已被选择的问题,第一种方法是比较通用的,对所有的DropDownList均适用,第二种方法是针对该问题而言的,比较具有针对性,只是一种解决问题的思路而已。

示例代码如下:

<td >
<asp:Label ID="lbcountry" runat="server" Text="所属国家"></asp:Label>
</td>
<td >
    <asp:DropDownList ID="Country_Code" runat="server">
       <%-- <asp:ListItem>请选择</asp:ListItem>
        <asp:ListItem Value="HK">Hong Kong</asp:ListItem>
        <asp:ListItem Value="ZA">South Africa</asp:ListItem>
        <asp:ListItem Value="VN">Viet Nam</asp:ListItem>
        <asp:ListItem Value="UA">Ukraine</asp:ListItem>
        <asp:ListItem Value="SE">Sweden</asp:ListItem>
        <asp:ListItem Value="RU">Russian Federation</asp:ListItem>
        ………………..
    </asp:DropDownList>
    <asp:RegularExpressionValidator ID="RegularExpressionValidator2" runat="server" 
        ErrorMessage="请选择国家" ControlToValidate="Country_Code" ValidationExpression="^[^请]+"></asp:RegularExpressionValidator> 

 

存储过程的参数为sql字符串问题

      因为之前做基础数据管理查询、分页用的都是执行的sql语句,每次都需要重新拼接Sql语句,这个数据量目前有10多万,以后还会再增加,在项目任务完成之后想着对查询分页优化一下,把查询分页改为存储过程,这样可以提升一些程序的效率。查询分页的存储过程需要传入三个参数,分别是“每页显示的信息条数”,“显示前多少条信息”,“和查询过滤的sql语句”。查询分页的存储过程(示例)如下:

CREATE PROCEDURE [dbo].[get_gtld_pager]
(
@pagesize int,
@sizecount int,
@sqlstr nvarchar(1000)
)
AS
BEGIN
Select Top @pagesize id,iana_id,tld,registrar_name,total_domains,total_nameservers,convert(varchar(20),publishdate,111) as publishdate 
from Test 
where id not in(select top @sizecount id from Test order by id asc) @sqlstr 
order by id asc
END

  

在执行的时候,老是提示如下的错误:

消息102,级别15,状态1,第1 行

'@pagesize' 附近有语法错误。 消息102,级别15,状态1,第1 行 '@sizecount' 附近有语法错误。

后来在查找了一些资料发现,在存储过程中select top 的值不能为参数,同时存储过程中不能执行参数为sql字符串。

当然,问题有解决的办法,主要核心的思想分两步:

1)       声明一个@sql字符串,将传入的参数与存储过程中的sql语句拼接成字符串@sql

2)       通过excute(@sql)的方式执行即可

所以修改后的存储过程如下:

ALTER PROCEDURE [dbo].[get_gtld_pager]
(
@pagesize int,
@sizecount int,
@sqlstr nvarchar(1000)
)
AS
BEGIN
declare @sql nvarchar(4000)
set @sql='Select Top '+ cast(@pagesize as nvarchar(4000))+' id,iana_id,tld,registrar_name,total_domains,total_nameservers,
convert(varchar(20),publishdate,111) as publishdate from GTLDSalesReport
where id not in(select top '+ cast(@sizecount as nvarchar(4000))+' id from GTLDSalesReport order by id asc) '+@sqlstr+' order by id asc' execute(@sql) END

  

将截断字符串或二进制数据。\r\n语句已终止。

    在做基础数据维护时,因为期间又临时被调去做了些其他的工作,对数据表进行了一些修改,当时匆忙忘了做背后,后来回来再做基础数据的维护进行数据的新增时遇到了这样的一个问题:“将截断字符串或二进制数据。\r\n语句已终止。”,很明显是字符的溢出,以为自己的程序的参数问题,检查了一遍,没发现什么不对的地方,然后又去看数据表结构,原来期间对表字段进行了修改,字段的长度变短了,而实际插入的数据长度超过了其最大长度限制,所以才会有这样的问题。只需要把数据库字段的长度改大一点即可。

备注:

     刚刚有朋友评论指出了其中的一些问题,自己思考、并且操作以后觉得确实有道理,所以在此进行更正。

1)       关于DropDownList是否已选择的验证问题

    因为当时只顾得验证“请选择”项的问题了,没有注意到其实可以将“请选择”项的值设置为””,即:<asp:ListItem value=””>请选择</asp:ListItem>,这样可以通过验证值是否为空字符串来验证,这个确实很好用,可以省下很多的事儿。

2)       关于存储过程中参数为sql字符串的问题

     因为上边提到的存储过程是用来分页的,里边的top值为传入的参数,直接执行的时候会提示有错误,此外因为传入的还有sql字符串参数,所以就把传入的参数和存储过程里的sql语句进行了拼接,事实上top值的参数可以加”()”括号即可,但是关于sql字符串的参数还需要转换为字符串,进行拼接然后执行excute(sql)方法才行

   非常感谢该网友的评论,受教!受教!