2009-04-28 33 views
1

Im遵循概述here执行此操作。MVC和XVal下拉 - 价值'请选择'是无效的

我在验证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")%> 

这是控制器的动作从帖子太,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作为false出现,因此from重新载入消息'请选择'值无效。如何阻止这种情况发生,以及如何使用xVal驱动的“请选择一个值”的验证方法?

回答

1

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

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

编辑: - 如jQuery validation根据您的意见,我用一个客户端验证插件提出了一些客户端验证。在大多数情况下,这将允许您提供合适的错误消息,而不必实际发布请求。在服务器端,如果ModelState无效且该特定字段无效,请使用更合适的字段替换错误消息。我不会建议改变模型以适应绑定框架。

+0

Mvc会将其映射到false否?因此它会出现一些被选中的东西? – Dan 2009-04-29 07:21:36

+0

我误解了你的问题吗?你说现在他们得到一个验证错误“值”请选择“无效”,你想停止错误?你想要发生什么? – tvanfosson 2009-04-29 12:09:05

1

布尔值是一个值类型,所以它将始终有一个值。 [必需]因此没有实际效果。如果您使用可空的<bool>而不是?如果第一个选项被选中,这应该允许MVC分配一个空值,然后Required属性可以断言用户确实选择了一个值。