0

我有控制器从我的数据库中获取对象列表并返回此列表:

public ActionResult Index()
{
    var list = db.MyObjects.Where(x => x.family == "Web").ToArray();
    list = list.Distinct(new MyObjectByProtocolComparer())
               .OrderBy(x => x.fileName)
               .ToArray();
    ViewBag.Files = list;
    return View();
}

索引.cshtml:

此返回列表插入到DropDownList

@using (Html.BeginForm())
{
    <div>
        @Html.DropDownList(
           "File", new SelectList(ViewBag.Files,
           "protocol_site", "protocol_site"),
           "Select webmail site",
           new { style = "vertical-align:middle;" }
           )
        <button type="submit">Select</button>
    </div>
}

从中选择一个项目并点击按钮后,我的另一个控制器方法是获取DropDownList项目名称并进行新的数据库查询:

[HttpPost]
public ActionResult Index(string File)
{
    var list = db.MyObjects.Where(x => x.protocol == File).ToArray();
    ViewBag.Files = list;
    return View();
}

现在发生的事情是新查询再次插入到我的DropDownList但我希望这个列表发送到另一个页面并且我想从这个页面显示这个ListView。我怎样才能做到这一点 ?

4

1 回答 1

1

如果你想把它发送到另一个视图,你最好重定向到一个新的动作,而不是再次显示你的表单!

[HttpPost]
public ActionResult Index(string File)
{
    // Some validation logic
    return RedirectToAction("ShowList", new { protocol = File });
}

public ActionResult ShowList(string protocol)
{
    var list = db.MyObjects.Where(x => x.protocol == protocol).ToArray();
    ViewBag.Files = list;
    return View();
}

ShowList如果它是您定义的,则调用的视图会将您的项目显示为 listView。

编辑 :

当您想在同一个视图中显示您的列表时,您必须为您的列表指定一个不同的名称,因为ViewBag.Files您的下拉列表已经使用了该名称。

此外,由于您想根据下拉列表中的当前选择更新列表,我建议您使用Ajax helpers. 这是一个很好的链接:http: //geekswithblogs.net/blachniet/archive/2011/08/03/updating-partial-views-with-unobtrusive-ajax-in-mvc-3.aspx

基本上,您的视图 (index.cshtml) 应该使用 Ajax 表单,并准备一个div包含您的列表的空。您的表单调用的操作将返回一个插入到该 div 中的部分视图,而不刷新整个视图。

于 2013-11-12T11:48:20.393 回答