【问题标题】:Selecting value from dropdownlist gives error in asp.net从下拉列表中选择值会在 asp.net 中出现错误
【发布时间】:2018-03-07 10:04:24
【问题描述】:

我有一组代码填充我的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();
    }

【问题讨论】:

  • @mjwills:这一行dt = dt.AsEnumerable().Where(r =&gt; r.Field&lt;string&gt;("JIOSTATECODE") == ddlState).CopyToDataTable();

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


【解决方案1】:

问题在于以下几行:

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之前

【讨论】:

    【解决方案2】:

    您也应该检查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 不检查输入值,即是否为空或空,并尝试对其进行处理。这将导致NullReferenceException 被抛出。

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

    更新

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

    【讨论】:

    • 没错,我现在正在使用 JavaScript,只是输入了 !== 而不是 !=。感谢您指出。 :)
    • 我添加了!string.IsNullOrWhitespace() 而不是!=,只是为了让您在使用各种字符串时保持安全。
    • 即使在添加了那个条件之后,它也会在这一行被捕获dt = dt.AsEnumerable().Where(r =&gt; r.Field&lt;string&gt;("JIOSTATECODE") == ddlState).CopyToDataTable();
    • 我的 ddlState 仍然是 0 所以我猜它不是 null 或空
    • 是的,现在工作正常。但是这样的检查是正确的方法吗?
    猜你喜欢
    • 1970-01-01
    • 2022-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-24
    相关资源
    最近更新 更多