2009-06-17 26 views
0

我试图按照this,但默认的modelbinder让我的数组在服务器端为null。在ASP.NET MVC中使用HTML单选按钮阵列

HTML:

Question 1: 
<input name="list[0]" type="radio" value="1000" />No 
<input name="list[0]" type="radio" value="1001" />Yes 
Question 2: 
<input name="list[1]" type="radio" value="1002" />No 
... 

控制器动作:

public ActionResult Anamnesis(string[] list) 
{ 

如果我只选择了第二个 “无”(列表[0]缺少),那么DefaultModelBinder是不可能将其改造成一个阵列。

Thanx提前!

更新#1

重新格式化基础上的评论,谢谢!

更新#2

只是一个因子评分:创建一个隐藏的输入毕竟列表项,并以这种方式它的工作原理。但毫无疑问,这很丑陋。

Question 1: 
<input name="list[0]" type="radio" value="1000" />No 
<input name="list[0]" type="radio" value="1001" />Yes 
<input type="hidden" name="list[0]"/> 
Question 2: 
<input name="list[1]" type="radio" value="1002" />No 
<input type="hidden" name="list[1]"/> 
... 

令它非常重要:隐藏的价值只提交当无线电处于未选中状态。这个想法来自ASP.NET MVC帮手。 (顺便说一下,我不能使用Html.RadioButton存档此行为。)

+1

数组基于C#。将是一个开始。 – 2009-06-17 22:56:22

+0

真的!如果我选择第一个元素,效果很好 - 但如果我选择其他选项(列表[2]),则会失败。看起来默认联编程序需要一个从零开始的数组。但是,这是不可能的单选按钮...我可以切换到jQuery创建请求。 – boj 2009-06-17 23:15:02

+0

如果这些是单选按钮,即它们是互斥的(选择一个或另一个),那么你应该给它们相同的名称。否则,如果名称不同,它们将被视为单独的“集合”,并且可以将它们//都选中! (并且无法取消选择。) - Mike – Funka 2009-06-17 23:36:25

回答

0

您的更新#2似乎可以解决您的问题。你的Update#2也很有趣,你也可以使用这种方法来提供一个默认值(如999),以便在没有检查到任何东西时使用。

也许有另一种类似的方式来做你在问什么,这是基于this article,也使用隐藏的输入。这个想法是,你可以为您的每一个收音机创建索引,以避免出现在表单中较早的一个缺失的选择会导致所有后续选择要删除的情况:

Question 1: 
<input name="list.Index" type="hidden" value="0" /> 
<input name="list[0]" type="radio" value="1000" />No 
<input name="list[0]" type="radio" value="1001" />Yes 
Question 2: 
<input name="list.Index" type="hidden" value="1" /> 
<input name="list[1]" type="radio" value="1000" />No 
<input name="list[1]" type="radio" value="1001" />Yes 

我之所以提出这一点,是在您可能希望通过唯一ID将您的答案与特定问题相关联,而不仅仅是使用0,1,2等。我链接的文章将显示如何执行此操作的示例。

祝你好运!
-Mike

-1

单选按钮的名称属性应该是列表,而不是列表[n]。