将控制器方法viewbag中的列表显示到视图中的列表

时间:2017-05-09 14:23:38

标签: c# asp.net asp.net-mvc model-view-controller

我的控制器中有以下GET方法:

public ActionResult GetLinesByDestination()
{ 
    destinationService = new DestinationService();
    ViewBag.Destination_id = new SelectList(destinationService.All(), "Destination_id", "city");

    lineService = new LineService();
    ViewBag.Lines = new SelectList(lineService.All(), "line_id", "arrival");
    return View();
}

POST方法:

[HttpPost]
public ActionResult GetLinesByDestination(int? Destination_id)
{
    destinationService = new DestinationService();
    ViewBag.Destination_id = new SelectList(destinationService.All(), "Destination_id", "city", Destination_id);

    lineService = new LineService();
    ViewBag.Lines = new SelectList(lineService.GetLinesByDestination(Convert.ToInt16(Destination_id)), "line_id", "arrival").ToList();

    return View();
}

查看代码:

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()

    <div class="form-horizontal">

        <hr />
        @Html.ValidationSummary(true, "", new { @class = "text-danger" })


        <div class="form-group">
            @Html.Label("Destinations", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">
                @Html.DropDownList("Destination_id", null, "- Select a destination you want to depart from -", htmlAttributes: new { @class = "form -control" })
                @Html.ValidationMessage("Destination_id", "", new { @class = "text-danger" })
            </div>
        </div>


        <div class="form-group">
            @Html.Label("Lines", htmlAttributes: new { @class = "control-label col-md-2" })
            <div class="col-md-10">

                @Html.DropDownList("Lines", null, htmlAttributes: new { @class = "form-control" })
                @Html.ValidationMessage("Lines", "", new { @class = "text-danger" })
            </div>

执行GET时,所有这一切都会检索我的数据库中所有目的地和所有行的列表。但是,点击“提交”后,因此,执行POST方法时,只应显示离开用户所选目的地的行。这完全正常。

现在我的实际问题是:

Destination_id ViewBag应该仍然是视图中的下拉列表,因为用户必须从此处选择一个选项。不过,我喜欢在视图中显示为列表的行(例如&lt; li&gt;),因此不是下拉列表。我该怎么做呢?我之前尝试过一些foreach循环但是没有用。

1 个答案:

答案 0 :(得分:0)

通过您的选择列表进行迭代

您应该能够通过引用绑定到Text时设置的ValueSelectList属性来按预期迭代ViewBag集合:

@if (ViewBag.Lines != null) {
    <ul>
        @foreach (var line in ViewBag.Lines){
            <li>
               @line.Text - @line.Value
            </li>
        }
    </ul>
}

为了便于使用,您可以考虑将此集合实际绑定到特定的类而不是SelectList,这不仅可以在View中强大地键入,而且还允许您包含/引用属性除了TextValue

绑定您的值

就实际发布选择&#34;选择&#34;的值而言,您可能会考虑为每个列表项输出复选框值,然后存储与该项相关的属性,这些属性可以发布到您的表单:

<ul>
    @foreach (var line in ViewBag.Lines){
        <li>
           @line.Text - @line.Value
           <input type='checkbox' name='lines[]' value='@line.Value' / >
        </li>
    }
</ul>           

这将假设你想要回发一个代表&#34;值&#34;的值数组。每个选定的行。同样,如果您只想包含一个选项,则可以使用单选按钮替换这些选项,并确保name属性正确绑定到您的destination_id属性:

<ul>
    @foreach (var line in ViewBag.Lines){
        <li>
           @line.Text - @line.Value
           <input type='radio' name='Destination_id' value='@line.Value' / >
        </li>
    }
</ul>