从下拉列表中选择值会在 asp.net 中出现错误

Selecting value from dropdownlist gives error in asp.net

我有一组代码可以填充我的dropdownlist。所以当我 select 列表中的一些值时它工作正常,

但是当我进入默认的 selection 时 --Select-- 我收到错误消息

the source contains no datarows

然后转到 catch 部分

下面是我的代码。我知道我错过了一些东西。请建议如何处理这个

[WebMethod]
    public static MaintDetails[] GetMaintZone(string ddlState)
    {
        DataTable dt = new DataTable();
        List<MaintDetails> details = new List<MaintDetails>();

        if (HttpContext.Current.Session["dtStateMZ"] != null)
        {
            dt = (DataTable)HttpContext.Current.Session["dtStateMZ"];

            if (dt != null && dt.Rows.Count > 0)
            {
                try
                {
                    dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();
                    if (dt != null && dt.Rows.Count > 0)
                    {
                        foreach (DataRow dtrow in dt.Rows)
                        {
                            MaintDetails MZone = new MaintDetails();
                            MZone.MAINTID = dtrow["MAINTENANCEZONECODE"].ToString();
                            MZone.MAINTNAME = dtrow["MAINTENANCEZONENAME"].ToString();
                            details.Add(MZone);
                        }
                    }
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }
        return details.ToArray();
    }

您也应该检查一下 ddlState。当您执行检查以查看是否有会话变量时,还要检查 ddlState 是否不是默认值,例如

if (HttpContext.Current.Session["dtStateMZ"] != null && !string.IsNullOrWhitespace(ddlState) && ddlState != "0")
{
    // your logic here
}

return details.ToArray();

这应该可以防止您的代码失败。问题在行中:

dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();

可能是 CopyToDataTable 不检查输入值,即它是否为 null 或空,并尝试对其进行处理。这将导致抛出 NullReferenceException

为了安全起见,在 catch 块中添加 try..catch 块和 return 一个空数组。

更新

考虑到您收到 0ddlState 并且不会 return 任何结果,请检查您的字符串是否等于“0”。如果是,请不要进入 if 部分,而是跳过它。

问题在于这些行:

dt = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).CopyToDataTable();
if (dt != null && dt.Rows.Count > 0)
{

CopyToDataTable 行抛出异常,因为它是用(有效地)0 行调用的。那么,解决方案就是确保不会发生这种情况:

var bob = dt.AsEnumerable().Where(r => r.Field<string>("JIOSTATECODE") == ddlState).ToList();
if (bob.Count > 0)
{
    dt = bob.CopyToDataTable();

以上代码将数据复制到一个临时的List,然后确保在List调用之前有数据CopyToDataTable