使用 viewbag 将数组传递给视图

Pass an array to the view using viewbag

我有一个代码,我在其中使用复选框让用户选择他的偏好。

这是我控制器中的代码。

[HttpPost]
public ActionResult Selected_Softwares(string[] type){
    var results = db.Softwares_Reports_vw.Where(s => type.Contains(s.software_name)).OrderBy(s=>s.software_name);

//here i tried to pass the parameter to viewbag

ViewBag.type = type;


return PartialView(results);

}

在我看来:

<span style="float:right">  <input type="button" style="border: 2px groove #FBF5EF; background-color:ActiveCaption;"
   class="my-button" value="Export Data To Excel" name="back" 
   onclick="@("location.href='" + Url.Action("toExcel_Results2", "Softwares", new { softwares =  ViewBag.type }) + "'")" /> </span> 

在我的 excel 报告控制器中:

public ActionResult toExcel_Results2(string[] softwares)
    {
        Response.AddHeader("Content-Type", "application/vnd.ms-excel");
        return View(db.Softwares_Reports_vw.Where(s => softwares.Contains(s.software_name)).OrderBy(s=>s.software_name);

    }

但是这里的参数没有值。为什么?非常感谢任何帮助。

如果您在 Softwares\Selected_Softwares 视图中查看标记为 "Export Data To Excel" 的按钮的 HTML(在浏览器 F12 工具中),您会看到类似这样的内容(查看onclick 事件):

<input type="button" style="border: 2px groove #FBF5EF; 
    background-color:ActiveCaption;" class="my-button" 
    value="Export Data To Excel" name="back"   
    onclick="location.href='/Softwares/toExcel_Results2?softwares=System.String[]'">

请注意,您放入 ViewBag 的对象(一个字符串 [])只是在 HTML 中被序列化为 "System.String[]"。这是因为所有 ASP.NET MVC 所做的就是对该对象调用 ToString()。当您在 string[] 上调用 ToString() 时,您会得到字符串 "System.String[]".

以下是我的建议...您似乎想向 "toExcel_Results2" 操作发送一些数据。这通常表示您需要 POST 而不是 GET。这是一个相当简单的解决方案。只需更改您的 Selected_Softwares 视图以包含此内容:

@using (Html.BeginForm("toExcel_Results2", "Softwares", FormMethod.Post, new { id = "MyForm" }))
{
    <span>
        <input type="button" style="border: 2px groove #FBF5EF; background-color:ActiveCaption;"
               class="my-button" value="Export Data To Excel" name="back"
               onclick="document.getElementById('MyForm').submit();" />

        @for (int i = 0; i < ViewBag.type.Length; i++)
        {
            @Html.Hidden("softwares[" + i.ToString() + "]", (string)ViewBag.type[i]);
        }
    </span>
}

这样,您会发现您的 "toExcel_Results2" 操作能够接收完整的字符串数组。