在MVC中处理复选框的最佳方法

时间:2010-09-01 14:27:16

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

我正在尝试将复选框的值保存在查询字符串中具有相同名称(级别和coursetype)的表单中,以便我可以检查选择了哪些。在第一次提交中,我得到:

Search?coursetype=1416&coursetype=post16&level=3&level=6&level=1

这很好,所以我可以将值检查回视图并勾选之前选择的值。

但是,当我使用pagedList或Html.ActionLink时,例如:

Html.ActionLink("search again", "Search", new { coursetype = ViewData["coursetype"], level = ViewData["level"]})

我得到:Search?&coursetype=System.String%5B%5D&level=System.String%5B%5D

我尝试从数组中解析这些值,但是当我将它们发送到ActionLink中的htmlAttributes时,我得到:Search?coursetype%3D1416&coursetype%3Dpost16&level%3D3&level%3D6&level%3D1,因此视图无法找到复选框的值。

控制器:

[AcceptVerbs("GET")]
public ActionResult Search(string[] coursetype, string[] level)
{
   ViewData["level"] = level;
   ViewData["coursetype"] = coursetype;

   return View();
}

2 个答案:

答案 0 :(得分:1)

您使用的是强类型搜索视图吗?

我认为您会想要使用ViewModel在视图和控制器之间传递数据。

public class CourseViewModel
{
    public string Level { get; set; }
    public string CourseType { get; set; }
}

然后你的视图会被强烈输入到CourseViewModel中,所以你可以像这样构建你的ActionLink:

Html.ActionLink("search again", "Search", new { coursetype = Model.CourseType, level = Model.Level })

你的控制器看起来像这样:

[AcceptVerbs("GET")]
public ActionResult Search(string coursetype, string level)
{
   var viewModel = new CourseViewModel
   {
       CourseType = coursetype,
       Level = level
   };

   return View(viewModel);
}

希望这会有所帮助。我不确定这是不是你想要的,但如果你有任何问题,请告诉我!

答案 1 :(得分:0)

ViewData["..."]的类型为object。您希望将其作为string[]类型传递,因此您必须进行一些小改动:

而不是:

Html.ActionLink("search again", "Search", new { coursetype = ViewData["coursetype"], level = ViewData["level"]})

尝试:

Html.ActionLink("search again", "Search", new { coursetype = ViewData["coursetype"] as string[], level = ViewData["level"] as string[] })

我添加的唯一内容是在as string[] 之后 ViewData["..."]

希望有所帮助!