我有一个代码,我使用复选框,以便用户选择他的偏好。
这是我控制器中的代码。
[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);
}
但这里的参数没有价值。为什么?非常感谢任何帮助。
答案 0 :(得分:3)
如果您查看HTML(在浏览器F12工具中)标有&#34;将数据导出到Excel&#34;在您的Softwares \ Selected_Softwares视图中,您将看到类似的内容(查看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中按字面意思&#34; System.String []&#34;进行序列化。这是因为所有ASP.NET MVC都在该对象上调用ToString()。当你在字符串[]上调用ToString()时,你得到字符串&#34; System.String []&#34;。
以下是我推荐的内容......您似乎想要将一些数据发送到您的&#34; toExcel_Results2&#34;行动。这通常表示您需要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>
}
有了这个,你就会发现你的&#34; toExcel_Results2&#34; action能够接收完整的字符串数组。