3

可能有人可以解释这种行为:

我正在使用最新版本的 MvcContrib 中的 CheckBoxList 当我的页面第一次加载时 - 我只是返回我的视图

return View(Product.GetProduct(productId)); 

一切似乎都很好。所有 html 简单控件均已成功填充,包括复选框列表:

<%= this.CheckBoxList(model => model.Product.Statuses)
    .Options(Model.Statuses, model => model.Id, model => model.Name)
    .ItemFormat("{0}<br />")
%>

所以,我在这个表单上有几个按钮,例如按钮“搜索”()。如果找到任何东西,我可以按 productId 搜索并显示它。因此,我将 productId 传递给我的控制器,并且该控制器以与第一次相同的方式返回视图:

return View(Product.GetProduct(productId))

顺便说一句,我使用的是相同的逻辑 - 都是一样的:相同的视图、相同的控制器、相同的操作……没有什么新鲜事。但在那种情况下,我收到了这个错误信息:

字符串未被识别为有效的布尔值。说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息:System.FormatException:字符串未被识别为有效的布尔值。

源错误:

Line 268:                              <labe**strong text**l for="group<%=item.Value%>"><%=item.Text%></label><br />
Line 269:                          <% } %>--%>
Line 270:                          <%= this.CheckBoxList(model => model.Product.Statuses).Options(Model.Statuses, model => model.Id, model => model.Name).ItemFormat("{0}<br />")%>
Line 271:                        </div>
Line 272:                        </div>   

我发现,当第一次和之后加载视图时,如果所有复选框未选中,我都在单击搜索 - 一切都很好,但是当检查任何复选框时,我正在单击搜索 - 我会遇到此错误。

我需要帮助。有什么好主意吗?

4

1 回答 1

2

我相信 CheckBoxList 中存在一个错误,因此当它验证列表时,它要求复选框的值是布尔可转换字符串(“false”、“true”)。

因此,在您的示例中,如果您将 model => model.id 更改为 model => "true" 您会看到您不会收到错误消息:

 <%= this.CheckBoxList(model => model.Product.Statuses).Options(Model.Statuses, model => "true", model => model.Name).ItemFormat("{0}<br />")%>

但这不是你想要的。我的解决方法是在 ModelState 无效时从 ModelState 中删除 CheckBoxList 的元素(在您的情况下为 model.Product.Statuses)。

需要在 ModelState 中找到 model.Product.Statuses 对应的 key 并移除。我正在为我的案例使用以下代码段。您需要更改模型和属性。

if (!ModelState.IsValid)
{    
  ModelState.Remove(PropertyHelper<EmailModel>.GetProperty(x => x.Attachments).Name);
  ...

我正在使用 PropertyHelper 表单如何获取特定属性的 PropertyInfo?

我还在 mvccontrib 问题跟踪器中找到了这个相关链接:http: //mvccontrib.codeplex.com/workitem/7071

于 2010-11-19T20:46:57.723 回答