ASP.NET & MVC3 DropDownList 和 URL 参数



对于我的工作,我需要开发一个web应用程序,以便显示一些银行应用程序的工作列表。事实上,这个应用程序的大部分已经完成,但我必须包括一个下拉列表,允许选择工作类型。在这一点上我完全无法理解。

在我的索引页面上,我有一个列表,其中列出了一些应用程序及其状态(Job 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从我的View传递到URL,然后我对它们进行查询以获得列表。

问题是,当我在操作"PageDomaiens"视图中的下拉列表中选择一个值时,参数不会保留,而是显示一个空列表。我已经做了一些测试,比如验证在我的下拉列表中选择的值是否发送到我的控制器并工作,我可以在"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>

我希望我没有忘记任何事情。

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

由于空间限制,我将在这里回答:)。如果我理解正确的话,在索引页面上,左边有一张表,当你点击ESPAS Centre Est时,它打开了一个新页面,右边有CE ESPAS的列表。现在您在顶部有一个下拉列表,当用户选择其中一个值时,VarCR和VarAppli为空?(这里几乎是下班时间了,所以如果我做得不对,我会责怪它累了(:)

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

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

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

是的,大约是这样,当用户点击第一个表(左侧)中的ESPAS CE的STATUS时,两个参数(CR和Appli,在这种情况下,CR=CE和Appli=ESPAS)会从视图传递到URL,用于我的控制器"SuiviController"的操作,链接如下:<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年5月26日等。。。将要选择的值将取决于在第一页上选择的应用程序。

我想仅此而已,如果你有任何疑问,请告诉我:)

真的,谢谢你的帮助。

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

这真的很简单,我唯一需要添加的是在BeginForm中,我必须添加以下内容:

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

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

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

最新更新