【问题标题】:ASP.NET & MVC3 DropDownList and Url ParametersASP.NET & MVC3 DropDownList 和 Url 参数
【发布时间】:2023-03-10 02:55:01
【问题描述】:

对于我的工作,我需要开发一个 Web 应用程序以显示一些银行应用程序的工作列表。 实际上,这个应用程序的最大部分已经完成,但我必须包含一个允许选择工作类型的下拉列表。 在这一点上我完全被阻止了。

在我的索引页面上,我有一个列表,其中列出了一些应用程序及其状态(工作 OK、KO、...),用户可以单击应用程序的状态(这是一个图像)来显示显示更详细列表的其他页面,其中包含 2 个参数功能中的一些信息:应用程序和银行 ID。 这是我认为的链接:

<a href="@Url.Action("PageDomaines", new { Controller = "Suivi", CR = VarCR, Appli = VarAppli[j] })">
<img src="../../Content/Images/feu_rouge.png" alt="Statut OK" border="0" /></a>

两个参数 CR 和 Appli 从我的视图传递到 URL 到好的操作,然后,我对它们进行查询以获取列表。

问题是,当我在位于“PageDomains”操作视图的下拉列表中选择一个值时,不会保留参数,显示一个空列表。 我已经做了一些测试,比如验证我的下拉列表中选择的值是否发送到我的控制器并且它有效,我可以显示在“PageDomaines”视图中选择的值,但我没有保留我的参数 CR 和 Appli ...

这是我的操作“PageDomaines”和我的查询:

public ActionResult PageDomaines(string CR, string Appli, string DDL)
    {

        string GetCR = CR;
        string GetAppli = Appli;
        string GetDDL = DDL;


        if (GetDDL == null)
        {
            var items = GetDomaines();
            int Var1 = DateTime.Now.Year;
            int Var2 = DateTime.Now.Month;
            string Var3 = "" + Var1 + Var2;

            var Query = (from i in items
                         where i.Field<String>("CD_APPLI") == GetAppli && i.Field<String>("CD_CR") == GetCR && i.Field<Int64>("PERIODE").ToString().Contains(Var3)
                         select new Suivi { CD_TRT = i.Field<String>("CD_TRT"), LB_TRT = i.Field<String>("LB_TRT"), CD_CR = i.Field<String>("CD_CR"), PERIODE = i.Field<Int64>("PERIODE"), CD_APPLI = i.Field<String>("CD_APPLI"), STATUT = i.Field<String>("STATUT") }).ToList();

            ViewData["CR"] = GetCR;
            ViewData["Appli"] = GetAppli;

            return View(Query);
        }
        else
        {
            var items = GetDomaines();
            int Var1 = DateTime.Now.Year;
            int Var2 = DateTime.Now.Month;
            string Var3 = "" + Var1 + Var2;
            ViewData["DDL"] = GetDDL;
            var Query = (from i in items
                         where i.Field<String>("CD_APPLI") == GetAppli && i.Field<String>("CD_CR") == GetCR && i.Field<Int64>("PERIODE").ToString().Contains(Var3) && i.Field<String>("CD_TRT").Trim() == GetDDL
                         select new Suivi { CD_TRT = i.Field<String>("CD_TRT"), LB_TRT = i.Field<String>("LB_TRT"), CD_CR = i.Field<String>("CD_CR"), PERIODE = i.Field<Int64>("PERIODE"), CD_APPLI = i.Field<String>("CD_APPLI"), STATUT = i.Field<String>("STATUT") }).ToList();

            ViewData["CR"] = GetCR;
            ViewData["Appli"] = GetAppli;

            return View(Query);
        }
    }

    private List<DataRow> GetDomaines()
    {

        List<DataRow> liste = null;

        string query = "select CD_TRT, LB_TRT, CD_CR, PERIODE, CD_APPLI, case "
        + "when (exists (select 1 from dbo.LOGS l, dbo.REF_JOB j  where j.CD_JOB = l.CD_JOB and j.CD_TRT = t.CD_TRT and l.CD_CR = cr.CD_CR and l.STATUT = 'OK' and j.JR_EXEC >= DAY(l.DT_DEB))) "
        + "and not exists (select 1 from dbo.LOGS l, dbo.REF_JOB j  where j.CD_JOB = l.CD_JOB and j.CD_TRT = t.CD_TRT and l.CD_CR = cr.CD_CR  and l.PERIODE = p.PERIODE "
        + "and ((j.JR_EXEC < DAY(l.DT_DEB) and l.DT_DEB is not null) or (l.STATUT in('KO','NEXEC')))) then 'OK' "
        + "when (exists(select 1 from dbo.LOGS l, dbo.REF_JOB j  where j.CD_JOB = l.CD_JOB and j.CD_TRT = t.CD_TRT and l.CD_CR = cr.CD_CR  and l.PERIODE = p.PERIODE and j.JR_EXEC < DAY(l.DT_DEB) "
        + "and DAY(l.DT_DEB) IS not null and l.STATUT = 'KO')) then 'KO' "
        + "when (exists(select 1 from dbo.LOGS l, dbo.REF_JOB j  where j.CD_JOB = l.CD_JOB and j.CD_TRT = t.CD_TRT and l.CD_CR = cr.CD_CR  and l.PERIODE = p.PERIODE "
        + "and j.JR_EXEC < DAY(l.DT_DEB) and DAY(l.DT_DEB) IS not null and l.STATUT in('OK','NEXEC'))) then 'EN COURS' "
        + "when (exists(select 1 from dbo.LOGS l, dbo.REF_JOB j  where j.CD_JOB = l.CD_JOB and j.CD_TRT = t.CD_TRT and l.CD_CR = cr.CD_CR  and l.PERIODE = p.PERIODE "
        + "and j.JR_EXEC < DAY(l.DT_DEB) and DAY(l.DT_DEB) IS not null)) then 'EN RETARD' else 'NON INITIE' end STATUT "
        + "from dbo.REF_TRT t, dbo.REF_CR cr, (select distinct PERIODE from dbo.LOGS) p ";

        string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";

        using (SqlConnection conn = new SqlConnection(connString))
        {
            using (SqlCommand objCommand = new SqlCommand(query, conn))
            {
                objCommand.CommandType = CommandType.Text;
                DataTable dt = new DataTable();
                SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                conn.Open();
                adp.Fill(dt);
                if (dt != null)
                {
                    liste = dt.AsEnumerable().ToList();
                }
            }
        }

        return liste;
    }

    private List<DataRow> GetPERIODE()
    {
        List<DataRow> liste = null;

        string query = "select distinct PERIODE from dbo.LOGS";

        string connString = "Data Source=.;Initial Catalog=SUIVI_DWH;Integrated Security=True";

        using (SqlConnection conn = new SqlConnection(connString))
        {
            using (SqlCommand objCommand = new SqlCommand(query, conn))
            {
                objCommand.CommandType = CommandType.Text;
                DataTable dt = new DataTable();
                SqlDataAdapter adp = new SqlDataAdapter(objCommand);
                conn.Open();
                adp.Fill(dt);
                if (dt != null)
                {
                    liste = dt.AsEnumerable().ToList();
                }
            }
        }

        return liste;
    }

以及“PageDomaines”的视图:

@model IEnumerable<SUIVI_DWH.Models.Suivi>
@using SUIVI_DWH.Helpers
@{
    ViewBag.Title = "PageDomaines";
}
<h2>@ViewData["CR"]
    @ViewData["Appli"]
    @ViewData["DDL"]
</h2>
@using (Html.BeginForm("PageDomaines", "Suivi"))
{
    @Html.DropDownList("DDL", new SelectList(new[] { "MMCR", "MMCL", "MMCO", "MMSE", "MMAS" }), "--Select one--", new { onchange = "this.form.submit();" })
}

<table>
    <tr>
        <th>
            CD_TRT
        </th>
        <th>
            LB_TRT
        </th>
        <th>
            PERIODE
        </th>
        <th>
            STATUT
        </th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @item.CD_TRT
            </td>
            <td>
                @item.LB_TRT
            </td>
            <td>
                @item.PERIODE
            </td>
            <td>
                @if (item.STATUT == null)
                {
                    <img src="../../Content/Images/feu_croix.png" alt="Statut null" />
                }
                else if (item.STATUT == "KO")
                {
                    <a href="@Url.Action("PageLogs", new { Controller = "Suivi", CR = ViewData["CR"], Appli = ViewData["Appli"], TRT = item.CD_TRT, PERIODE = item.PERIODE })">
                        <img src="../../Content/Images/feu_rouge.png" alt="Statut KO" border="0" /></a>    
                }
                else if (item.STATUT == "OK")
                {
                    <a href="@Url.Action("PageLogs", new { Controller = "Suivi", CR = ViewData["CR"], Appli = ViewData["Appli"], TRT = item.CD_TRT, PERIODE = item.PERIODE })">
                        <img src="../../Content/Images/feu_vert.png" alt="Statut OK" border="0" /></a>                
                }
                else if (item.STATUT == "EN RETARD")
                {
                    <a href="@Url.Action("PageLogs", new { Controller = "Suivi", CR = ViewData["CR"], Appli = ViewData["Appli"], TRT = item.CD_TRT, PERIODE = item.PERIODE })">
                        <img src="../../Content/Images/feu_orange.png" alt="Statut en retard" border="0" /></a>                
                }
                else if (item.STATUT == "NON INITIE")
                {
                    <a href="@Url.Action("PageLogs", new { Controller = "Suivi", CR = ViewData["CR"], Appli = ViewData["Appli"], TRT = item.CD_TRT, PERIODE = item.PERIODE })">
                        <img src="../../Content/Images/feu_blanc.png" alt="Statut non initié" border="0" /></a>                
                }
                else if (item.STATUT == "EN COURS")
                {
                    <a href="@Url.Action("PageLogs", new { Controller = "Suivi", CR = ViewData["CR"], Appli = ViewData["Appli"], TRT = item.CD_TRT, PERIODE = item.PERIODE })">
                        <img src="../../Content/Images/feu_jaune.png" alt="Statut en cours" border="0" /></a>                
                }
            </td>
        </tr>
    }
</table>

我希望我没有忘记任何东西。

你有什么解决这个问题的建议吗?

【问题讨论】:

  • 如果我理解正确,新页面应该在“查询”中显示“Suivi”列表,您是否检查以确保“查询”实际上包含结果(抱歉,但首先消除了最明显的结果(: )
  • 顺便说一句:为什么不使用包含 Suivi、Appli、CR 和 DDL 列表的 viewModel,而不必使用 viewData?
  • 我检查了我的查询是否包含正确的结果,并且确实如此。问题在于未保留的参数 CR 和 Appli,因此当查询尝试选择我的 CD_CR 字段等于我的参数 CR 的结果时,我的查询不返回任何内容,因为我的参数不包含任何内容。
  • 对于viewModel而不是viewData,真的更好吗?我不太了解 ASP.net,因为我开始使用它才三周。
  • VarCR 有什么价值?是空的吗?

标签: asp.net-mvc url-parameters html-select


【解决方案1】:

由于篇幅限制,我将在这里回答:)。如果我理解正确,在索引页面上,左侧有表格,当您单击 ESPAS Centre-Est 时,它会打开一个新页面,右侧的表格列出 CE ESPAS。现在您在顶部有一个下拉菜单,当用户选择其中一个值时,VarCR 和 VarAppli 为空? (这里快要下班了,所以如果我没有做对,我会把它归咎于累(:)

如果是这种情况,您需要向我们展示下拉菜单的代码,但在此之前,我认为您应该考虑让用户通过单击表格或至少勾选复选框来做出选择/按下放置在每行开头或结尾的按钮。当其他一切看起来都一样时,我不想让用户通过 2 种不同的方法进行选择,但这只是我。如果您从表中进行选择,您可以让 URL 包含 CE 和 Appli 的值,就像在第一个表中一样,如果您仍然想要下拉列表,您必须使用选择列表查看它,因为它可以帮助您有一个显示值和一个“支持”值,您可以在其中存储其他信息,例如 CE 和 Appli 值,您可以在此处查看:http://msdn.microsoft.com/en-us/library/system.web.mvc.selectlist(v=vs.108).aspx

希望这能回答你的问题,如果不清楚,请告诉我,我的脑海里很清楚,但它可能会变得混乱:)

【讨论】:

    【解决方案2】:

    我没有足够的空间,所以我会在这里回答。

    是的,大概是这样,当用户在第一个表(左侧)中单击 ESPAS CE 的 STATUS 时,两个参数(CR 和 Appli,在这种情况下,CR = CE 和 Appli = ESPAS)是使用此链接从视图传递到我的控制器“SuiviController”的操作的 URL: <a href="@Url.Action("PageDomaines", new { Controller = "Suivi", CR = VarCR, Appli = VarAppli[j] })"> <img src="../../Content/Images/feu_rouge.png" alt="Statut OK" border="0" /></a>

    之后,我的操作获取了两个参数:CR 和 Appli,以便在 where 子句中使用此参数进行查询(查询在我的第一篇文章中)。我的查询结果返回到我的操作视图,并在第二页(右侧)上显示第二个表格,并带有下拉列表。 另一件事,当用户在第二页时,URL 是这样的:

    http://localhost:56672/Suivi/PageDomaines?CR=CE%20%20%20%20%20%20%20%20&Appli=ESPAS
    

    但是当用户在下拉列表中选择一个值时,页面被刷新并且我丢失了我的参数,url变成了这个:

    http://localhost:56672/Suivi/PageDomaines
    

    当我在下拉列表中选择一个值时,我丢失了从第一页传递的参数,我不知道如何保留它们...

    下拉列表的代码显示在第一篇文章中,但这里是:

        @using (Html.BeginForm("PageDomaines", "Suivi"))
    {
        @Html.DropDownList("DDL", new SelectList(new[] { "MMCR", "MMCL", "MMCO", "MMSE", "MMAS" }), "--Select one--", new { onchange = "this.form.submit();" })
    }
    

    我说清楚了吗?


    对于第二段中提到的点,我不想给用户这样的选择,对于我的问题,我使用了一个带有简单选择的下拉列表,只是为了在第二个表中显示所有CD_TRT 等于所选值的行,所以如果我选择 MMCL,将显示行:MMCL / Client - DMCL / 20121001 / Status。 但这不是我最终会得到的下拉列表。最终的下拉列表将是一个列表,用户可以在其中根据以下格式选择在日期函数中执行的作业:2012 年 1 月、2012 年 2 月……或其他应用程序(例如 BO)2012 年 1 月 25 日, 2012 年 1 月 26 日等... 将选择的值取决于在第一页上选择的应用程序。

    我想就是这样,如果您有任何疑问,请告诉我:)

    真的,感谢您的帮助。

    【讨论】:

    • 尝试为表单中的每个变量包含一个隐藏字段(因此在 beginform 之后和下拉之前会这样做),看看是否可以解决问题....正如我所说的那样,它几乎要退出了时间,所以这就是为什么我错过了下拉代码......这是我的故事,我坚持它:)
    • 这是正确的吗? @using (Html.BeginForm("PageDomaines", "Suivi")) { Html.Hidden("CR", ViewData["CR"]); Html.Hidden("Appli", ViewData["Appli"]); @Html.DropDownList("DDL", new SelectList(new[] { "MMCR", "MMCL", "MMCO", "MMSE", "MMAS" }), "--Select one--", new { onchange = "this.form.submit();" }) }我不知道如何使用这个隐藏字段,我检查了一些帖子,但我真的不明白如何使用它......编辑:啊啊!!!我的缩进在哪里?好丑xD
    • 所以,我尝试了一些东西,但结果总是一样:全局变量和表。在我解决问题的研究过程中,我看到了 cookie 和应用程序变量,这些东西对我有帮助吗?并创建一个新类,我将在其中放入参数的值,它会有效吗?
    【解决方案3】:

    是的,我在另一个论坛的某人的帮助下找到了解决方案。

    这真的很简单,我唯一需要添加的就是在 BeginForm 中,我必须添加这个:

    @using (Html.BeginForm("PageDomaines", "Suivi", new { CR = @ViewData["CR"], Appli = @ViewData["Appli"] }))
    

    在 BeginForm 中,我按顺序有我的操作、我的控制器以及我想要传递给我的控制器的参数及其值。

    在我的研究过程中,我想到了一个解决方案,但我不知道如何编写代码。使用正确的语法,一切顺利。

    【讨论】:

      猜你喜欢
      • 2013-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 2012-05-31
      • 1970-01-01
      相关资源
      最近更新 更多