从下拉列表中选择值会在 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 一个空数组。
更新
考虑到您收到 0
的 ddlState
并且不会 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
。
我有一组代码可以填充我的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 一个空数组。
更新
考虑到您收到 0
的 ddlState
并且不会 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
。