如何在BeginForm()中发送列表?

时间:2013-04-12 02:23:11

标签: asp.net asp.net-mvc-3 razor

有人可以帮我解决这个问题吗?在页面加载之前的视图底部,我创建了一个复选框数组,如下所示:

foreach (var course in courses.Select((x, i) => new { Data = x, Index = i }))
 {
  int currentIndex = course.Index;
  String selectedday = "";
  String selectedteacher = "";

  if (cnt++ % 4 == 0)
   {
    @:  </tr> <tr>
   }
  @: <td >  
     <br /><br /><br />
 <input type="checkbox"  id="checkbox"
                       name="selectedCourses"  
                      value="@course.Data.CourseID"  
                   @(Html.Raw(course.Data.Assigned ? "checked=\"checked\"" : ""))
                   /> 

我使用相同的循环将指定的状态添加到这样的列表中:

bool theNewString=course.Data.Assigned ;
String a=theNewString.ToString();
assignedCourses.Add(a);

我在页面顶部定义了一个列表变量,以便可以在表格范围内访问它,如下所示:

    @{List<String> assignedCourses =new List<String>(); }

现在我想将该变量发送到控制器,这就是事情变得混乱的地方。如果我发送这样的字符串,它可以正常工作:

Razor标记

String postedData = "literalString";
@using (Html.BeginForm("Action", "Controller", new { assigned = @ postedData }))

动作

[HttpPost]
public ActionResult Edit(int id,List<String> assigned){}

现在,如果我试试这个:

@{List<String> assignedCourses =new List<String>(); }
@using (Html.BeginForm("Action", "Controller", new { assigned = @assignedCourses }))

控制器没有任何结果。就像列表在发布之前清空一样。如何将我的列表发送给控制器?

1 个答案:

答案 0 :(得分:0)

我认为您尝试使用列表为表单创建查询字符串/回发网址的方式是错误的,并且不会生成格式正确的字符串。

也许尝试这样的事情:

@{

    List<string> ExampleList = new List<string>();
    ExampleList.Add("True");
    ExampleList.Add("False");

    string param = string.Join("&", ExampleList.ToArray());


    }
@using (Html.BeginForm("index", "home", new { @someparam = (new HtmlString(param)) })) { }

这将要求您在操作方法接收时将单个字符串拆分为数组。

或者您可以尝试使用RouteValueDictionary而不是列表,但这不支持重复键。

同样对于复选框创建尝试使用@ Html.CheckBox(),因为这将自动创建第二个隐藏输入设置为false。 HTML表单在未选中时不会回发复选框值,因此将返回具有相同名称的第二个隐藏输入,您将知道它已取消选中或未选中。当只返回带有“False”值的隐藏输入时,MVC会将相同形式键/输入名称的“True,False”值解释为True和False。