我有一些看起来像这样的复选框
<%= Html.CheckBox("Remember") %>
<%= Html.Label("Remember", "Keep me signed in for two weeks.") %>
这是一种形式。因此,当它转到我的Action方法时,我只有一个表单Collection变量。现在我尝试做
frmSign [ “记住”];
所以我试图将其转换为布尔值并失败。然后我做了.toString(),我意识到包含的值是
“真,假”
这是正常的吗?为什么这是真的,是假的?它现在是真还是假?
答案 0 :(得分:9)
您只需在操作中添加一个布尔参数:
public ActionResult LogIn(string username, string password, bool remember)
{
// You have it
}
此外,您可以使用RouteValues [“Remember”]来获取ValueProviderResult 所以你可以这样做:
public ActionResult LogIn(string username, string password)
{
bool remember = false;
ValueProviderResult val;
if (RouteValues.TryGetValue(key, out val))
remember = (bool)val.ConvertTo(typeof(bool));
// Now you have it
}
但出于显而易见的原因,我更喜欢第一种选择。
至于问题:
这是正常的吗?为什么这是真的,是假的?什么现在是真是假?
是的,这很正常。 MVC中的复选框帮助程序始终生成值为“False”的隐藏输入。如果未选中复选框,则需要提供False值
为什么呢?
因为根据W3.ORG,如果选中复选框,则仅将值发布到服务器,否则不会(因此您不知道它是True还是False,例如为null)。
因此,如果您选中“true,false”复选框,则可以安全地假设该值为true 如果未选中该复选框,则“false”将出现在服务器上,您可以确定它未被选中。
为了澄清更多:用逗号分隔的值(根据W3.ORG)具有相同的名称。因此,在单个表单中使用相同名称的不同输入是完全正确的(即使输入的类型不同:复选框,广播,文本,隐藏等)。