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

时间:2018-03-07 10:04:25

标签: c# asp.net drop-down-menu webmethod

我有一组填充dropdownlist的代码。因此,当我从列表中选择一些值时,它可以正常工作,

但是当我进入默认选择--Select--时,我得到错误

  

源不包含数据行

然后转到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();
    }

2 个答案:

答案 0 :(得分:2)

问题出在这些方面:

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

答案 1 :(得分:0)

您也应该检查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被抛出。

如果您想要安全起见,请添加try..catch块并在catch块中返回一个空数组。

更新

考虑到您收到0的{​​{1}}并且不会返回任何结果,请检查您的字符串是否等于&#34; 0&#34;。如果它没有进入ddlState部分,但跳过它。