级联DropDownLists

时间:2012-12-17 13:08:54

标签: jquery sql-server asp.net-mvc-3 list cascadingdropdown

对于我的应用程序,我需要合并一些下拉列表,以便在这些列表中选择的不同值的函数中显示一些表。 但是当我在一个列表中选择一个值时,另一个填充了该值的函数,我不知道该怎么做。

在我的应用程序中,我只使用这样的Raw查询:

        string requeteAppli ="select distinct CD_APPLI, ORDRE_APPLI from dbo.REF_APPLI where CD_APPLI != 'PNB' order by ORDRE_APPLI";

具有执行它们的功能:

public List<DataRow> executerRequete(string query)
    {
        //Initialisation d'une variable Liste contenant des lignes de données où seront récupérés les résultats de la requête suivante.
        List<DataRow> liste = null;

        //Création d'une variable de connection où sont stockés toutes les informations nécessaires à la connexion à la base de données.
        //Ces informations sont stockées dans le fichier de config Web.config.
        string connString = ConfigurationManager.AppSettings["REF_ConnectionString"];

        //Création d'un objet instance de SqlConnection (classe permettant la connexion ouverte à une base de données) où est stocké le contenu de la variable connString.
        using (SqlConnection conn = new SqlConnection(connString))
        {
            //Création d'un objet de commande permettant de spécifier comment la commande sera inteprétée, ici en commande de texte SQL avec CommandType.Text.
            using (SqlCommand objCommand = new SqlCommand(query, conn))
            {
                //Création d'un objet de commande permettant de spécifier comment la commande sera inteprétée, ici en commande de texte SQL avec CommandType.Text.
                objCommand.CommandType = CommandType.Text;
                //Création d'un objet instance de DataTable qui va récupérer la résultat de la requête.
                DataTable dt = new DataTable();
                //Création d'un objet instance de SqlDataAdapter qui va effectuer le lien avec SQL Server afin de récupérer les données.
                SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                //Ouverture de la connexion.
                conn.Open();
                //L'instruction FILL récupère les données de la source de données et les insère dans dt.
                adp.Fill(dt);
                //Vérification du contenu de dt.
                if (dt != null)
                {
                    //Remplissage de la liste.
                    liste = dt.AsEnumerable().ToList();
                }
            }
        }

        //Le résultat est retournée à l'action.
        return liste;
    }

问题在于这些查询,我已经看过很多关于如何使用ASP.NET MVC和jQuery实现级联下拉列表的教程,但它不是这种查询方式而且我完全与它们混淆了无法改变它们。

我在这样的行为中得到了这些查询的结果:

var queries = new query();
var items = rq.executerRequete(requeteIndex);
queries.Query2 = (from i in items2
                  select new Suivi { CD_APPLI = i.Field<String>("CD_APPLI") }).ToList();

我的目标是拥有第一个应用程序列表,当用户选择一个值时,另一个包含某个日期(取决于所选应用程序)的列表将填入函数。 以下是获取所选应用程序的日期的查询:

var itemsDate = rq.executerRequete(requetePERIODE);
var periode = (from i in itemsDate
               where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
               select new Suivi { PERIODE = i.Field<Int64>("PERIODE") });

我完全迷失在这些级联下拉列表中,我真的需要你的帮助:/ 如果你需要代码,我可以给你这个,但即使我已经为这些列表尝试了一些解决方案,我也不能给你一个我的代码(javascript)的例子,因为它根本不起作用,我做了什么,我的代码简直就是废话......

3 个答案:

答案 0 :(得分:2)

服务器端 您使用应用程序ID和要显示的内容填充应用程序下拉列表

客户机侧 您需要在第一个下拉列表的更改事件上附加一个函数 获取数据并填写日期下拉列表 喜欢

    $(document).ready(function(){
     $('#CboApplications').change(function() {
      function getDates() {
      $.ajax({
          type: "POST",
          url: "Reg_Form.aspx/GetDates",
          data: "{'applicationId':" + ( $('#CboApplications').val()) + "}",
          contentType: "application/json; charset=utf-8",
          global: false,
          async: false,
          dataType: "json",
          success: function(jsonObj) {
             for (var i = 0; i < jsonObj.Table.length; i++){
               listItems+= "<option value='" + jsonObj.Table[i].PERIODE+ "'>" + jsonObj.Table[i].PERIODE+ "</option>";
              }
             $("#cboDates").html(listItems);
        }
    });
    return false;
}
    });

要获取数据,您需要一个Web方法或一个带有执行查询代码的Web方法的Web服务

<WebMethod()> _
Public Sub GetDates(ByVal applicationId As String)
    //use correct qry based on applicationId 
    var itemsDate = rq.executerRequete(requetePERIODE);
    var periode = (from i in itemsDate
           where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
           select new Suivi { PERIODE = i.Field<Int64>("PERIODE") });
    Return periode 
End Sub

这段代码不会100%正确,因为我不能自己测试它,但这个概念可能对你有帮助

页面中的webmethod示例(重要的是静态的,WebMethod和用于ajax调用的ScriptMethod)

public partial class Products : System.Web.UI.Page 

   { 
    [System.Web.Services.WebMethod()] 
    [System.Web.Script.Services.ScriptMethod()] 
    public static List<Product> GetProducts(int cateogryID) 
    {
      // Put your logic here to get the Product list 
    }

答案 1 :(得分:0)

是的!!!它有效!!

问题在于获取第二个列表结果的查询,我必须这样做:

var periode = (from i in itemsDate
                       where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
                       select new { value = i.Field<Int64>("PERIODE").ToString(), text = i.Field<Int64>("PERIODE").ToString() });

而不是那样:

            var periode = (from i in itemsDate
                       where i.Field<String>("CD_APPLI").Trim() == appli.Trim()
                       select new SelectListItem { Value = i.Field<Int64>("PERIODE").ToString(), Text = i.Field<Int64>("PERIODE").ToString() });

我的其余代码相对于第二个答案没有变化。

现在我将尝试使用第三个列表,如果我遇到其他问题,我会回到这里。

非常感谢你的帮助,ufosnowcat:D

答案 2 :(得分:0)

作为对上一条评论的回答

添加请选择将是1种方式; 在你的返回函数中为你的3d列表数据插入位置0的值'请选择'强制用户触发动作

另一种选择是: 1)将你现在在.change函数中调用的逻辑放在一个单独的函数中,这样可以更容易地从几个地方调用

然后在填充当前(3d)列表后绑定更改函数的位置,检查列表中是否只有1个项目 如果是这样调用函数来填充第4个列表,你可以将它集成到每个列表的填充中:

之后
$.each(months, function (index, periode) {... }));

把类似的东西(检查你可以用句号做什么)

if (periode.count() == 1) {fillnextList();};