【问题标题】:MVC Pass multiple parameters to controller including a list from the modelMVC 将多个参数传递给控制器​​,包括模型中的列表
【发布时间】:2017-09-15 23:28:48
【问题描述】:

我正在尝试将模型中的列表和视图中的字符串传递给我的控制器。我成功地从 Home 控制器获取数据到 Dashboard.cshtml,但是当我尝试将列表从模型传递到 DetailController 时,列表没有通过,但字符串 TicketGroupName 可以。对我做错了什么有什么想法吗?

仪表板.cshtml

@model testlogin.Models.DashboardViewModel

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>@Model.AreaName</h2>

<table id="dashboardContainer" class="table">
    <tr class="data-row-1">
        <td class="tile text-center">
            <a href="http://company.html"><img style="height: 125px" id="Image1" src="https://logo.jpg" /></a>
        </td>
        <td class="tile btn text-center">
            <a href="@Url.Action("ShowTickets", "Detail", new { TicketList = Model.OpenNow, TicketGroupName = "Open Now" })">
                <div>
                    <div class="row tile-head">
                        <h4>Open Now</h4>
                    </div>
                    <div class="row">
                        <h1><strong>@Model.OpenNow.Count</strong></h1>
                    </div>
                </div>
            </a>
        </td>
    </tr>
</table>

HomeController.cs

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Dashboard(string AreaName)
    {
        full_area_name = "Test Area";
        var dash = GetDashData(board_number); //Not including it here, but this method works
        dash.AreaName = full_area_name;

        return View(viewName: "Dashboard", model: dash);
    }
}

DashboardViewModel.cs

public class DashboardViewModel
{
    public List<TicketModel> OpenNow { get; set; }
}

DetailController.cs

public class DetailController : Controller
{
    public ActionResult ShowTickets(List<TicketModel> TicketList, string TicketGroupName)
    {
        TicketViewModel vm = new TicketViewModel()
        {
            GroupName = TicketGroupName,
            Tickets = TicketList
        };
        return View(vm);
    }
}

TicketViewModel.cs

public class TicketViewModel
{
    public string GroupName { get; set; }
    public IEnumerable<TicketModel> Tickets { get; set; }
}

ShowTickets.cshtml

@model testlogin.Models.TicketViewModel

@{
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="container">
    <div>
        <h1>@Model.GroupName</h1>
    </div>
    <table class="table table-striped table-bordered table-hover">
        <tr>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().TicketNbr)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Company_Name)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Priority_Description)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Summary)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Last_Update)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().OwnerOrCloser)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Date_Entered_UTC)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Date_Responded_UTC)</th>
            <th>@Html.LabelFor(model => model.Tickets.FirstOrDefault().Date_Closed_UTC)</th>
        </tr>
        @Html.DisplayFor(x => x.Tickets)
    </table>
</div>

【问题讨论】:

  • 您不应通过 GET 操作单击链接传递列表。您应该在 ShowTickets 操作方法中再次获取它。
  • 您不能使用 Url.Action() 将集合传递给 GET 方法(查看您生成的 html)。您需要将集合中每个项目的每个属性作为查询字符串参数传递,这会很疯狂,并且可能无论如何都会超过查询字符串限制)。在方法中再次获取集合。
  • 我明白了。我会尝试并发布结果。谢谢你们的帮助,你们俩!

标签: c# asp.net-mvc razor


【解决方案1】:

按照@Shyju 和@Stephen_Muecke 的建议,我重新安排了控制器中的代码,以便在视图调用操作时再次从Http 缓存中获取数据。

只是为了明确以防其他人正在搜索此答案,您不能将列表(或 IEnumerable)对象从视图传递到控制器。必须在控制器中再次收集列表数据。

感谢您的帮助,伙计们!

【讨论】:

    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2015-06-30
    • 1970-01-01
    • 2010-11-10
    • 1970-01-01
    相关资源
    最近更新 更多