1

我按照此处概述的方法来执行此操作。

我在使用 xval 验证下拉选择时遇到问题,MVC 绑定似乎推断出允许操作通过验证的错误,但是模型状态存储了绑定异常并使页面无效 - 所以我得到了操作的情况允许使用无效数据执行,但页面无效,因此导致用户相信验证失败。

这可能会更清楚

这是我的下拉菜单,假设用户什么都没做,所以选择了“请选择”。

  Do you like cheese:
     <select name="Favourites.Cheese">
         <option>Please Select</option>
        <option value="1">Yes</option>
        <option value="0">No</option>
     </select>
     <%=Html.ValidationMessage("Favourites.Cheese")%>

这也是来自帖子的控制器操作,MVC 将值 false 映射到 fav.cheese,

public ActionResult Create(Favourites fav)
{
            try
            {
                _favTask.Create(fav);
            }
            catch (RulesException ex)
            {
                ex.AddModelStateErrors(ModelState, "Favourites");
            }

            if(!ModelState.IsValid)
            {
                //redirect back
            }
            //other stuff
 }

该物业已归属

 pulic class Favourites
    {
         [Required]
          public bool Cheese{get;set;}
    }

不会抛出异常,因为 fav.cheese 有一个值

public int Create(Favourites fav)
{

   var errors = DataAnnotationsValidationRunner.GetErrors(fav);
   if (errors.Any())
       throw new RulesException(errors);

       //create fav   
 }

但是当焦点返回到控制器时 ModelState.Isvalid 出来为假,所以从重新加载消息The value 'Please Select' is invalid。如何阻止这种情况的发生,以及如何使用 xVal 驱动“请选择一个值”的验证方法?

4

2 回答 2

1

如果您希望用户不能选择一个值并推断为 false,那么我会给您的默认选择值 0。这样即使他们没有选择一个值,也会发送一个值,并且 Required 属性将满意。

<option value="0">Please Select</option>

编辑:根据您的评论,我建议使用客户端验证插件进行一些客户端验证——例如 jQuery验证。在大多数情况下,这将允许您提供合适的错误消息,而无需实际发布请求。在服务器端,如果 ModelState 无效并且该特定字段无效,则将错误消息替换为更合适的错误消息。我不建议仅仅为了适应绑定框架而更改模型。

于 2009-04-28T18:59:08.747 回答
1

Boolean 是一种值类型,所以它总是有一个值。[必需]因此没有实际效果。如果你改用 Nullable<bool> 会发生什么?如果选择了第一个选项,这应该允许 MVC 分配一个空值,然后 Required 属性可以断言用户确实选择了一个值。

于 2009-04-29T22:24:38.133 回答