代码之家  ›  专栏  ›  技术社区  ›  Dan TheCodeJunkie

带有下拉列表的MVC和XVal-“请选择”值无效

  •  1
  • Dan TheCodeJunkie  · 技术社区  · 16 年前

    here 做这个。

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

    这样可能会更清楚

    这是我的下拉列表,假设用户什么都没做,所以“请选择”被选中。

      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")%>
    

    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   
     }
    

    但是,当焦点返回到controller ModelState.Isvalid时,将显示为false,因此from将重新加载消息 如何阻止这种情况的发生,以及如何使用xVal驱动的“请选择一个值”验证方法?

    2 回复  |  直到 16 年前
        1
  •  1
  •   GalacticCowboy    16 年前

    布尔值是一种值类型,因此它将始终有一个值。[必需]因此没有实际效果。如果改用可为空的<bool>会发生什么?如果选择了第一个选项,这将允许MVC分配一个空值,然后必需的属性可以断言用户实际上选择了一个值。

        2
  •  1
  •   tvanfosson    16 年前

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

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

    编辑 :根据您的评论,我建议使用客户端验证插件(如jQuery)进行一些客户端验证 validation