2015-01-02 33 views
1

我想用我的viewModel来验证表单客户端和服务器端。除了我的Kendo Combobox,我已经完成了所有的验证工作。我已将模型绑定到多选,但我不知道如何区分列表和所选值。如何将模型绑定到kendo组合框以便使用模型验证?

组合框:

@(Html.Kendo().ComboBox() 
    .Name("roleRequest_UnavailableRoles") 
    .BindTo(new SelectList(Model.roleRequest.UnavailableRoles, "Value", "Text")) 
    .HtmlAttributes(new { name="addRoleName", style = "width:250px", required = true, roleValidationMessage = "foo" }) 
    .Value(Model.roleRequest.roleName) 
    .DataTextField("Text") 
    .DataValueField("Value") 
    .Filter(FilterType.StartsWith) 
    .Placeholder("Select Role...") 
    .AutoBind(false) 
    .Suggest(true) 
) 

视图模型:

[Required] 
    public string roleName { get; set; } 

    [Required] 
    public string usersName { get; set; } 

    [Required] 
    public string application { get; set; } 

    [Required] 
    public string reasons { get; set; } 

    public virtual IEnumerable<SelectListItem> UnavailableRoles 
    { 
     get 
     { 
      var unavailableList = new List<Role>(); 

      unavailableList = RoleHelper.GetUnavailableRoles(usersName, application); 

      var unavailableRolesList = (unavailableList.Distinct()); 

      var UnavailableRoles = new List<SelectListItem>(); 

      foreach (var role in unavailableRolesList) 
      { 
       UnavailableRoles.Add(new SelectListItem 
      { 
       Value = role.RoleID.ToString(), 
       Text = role.RoleName 
      }); 
      } 


      return new SelectList(UnavailableRoles, "Value", "Text"); 
     } 
    } 

控制器: [HttpPost] 公共ContentResult类型RoleRequest(AddRoleRequestViewModel视图模型) { 如果(ModelState中。已验证) { return Content(“1”); } return Content(“”); }

上面的代码确实编译,但我不能让控制器返回无效,如果组合框中没有选择项目。谁能解释如何解决这个问题?

任何帮助将不胜感激。

回答

2

如果使用Html.Kendo().ComboBoxFor(),你可以将其绑定到一个类似的模型属性:

@(Html.Kendo().ComboBoxFor(m => m.UnavailableRoles) 
    .Name("roleRequest_UnavailableRoles") 
    .BindTo(new SelectList(Model.roleRequest.UnavailableRoles, "Value", "Text")) 
    .HtmlAttributes(new { name="addRoleName", style = "width:250px", required = true, roleValidationMessage = "foo" }) 
    .Value(Model.roleRequest.roleName) 
    .DataTextField("Text") 
    .DataValueField("Value") 
    .Filter(FilterType.StartsWith) 
    .Placeholder("Select Role...") 
    .AutoBind(false) 
    .Suggest(true) 
) 

注意,这样做的时候,你不需要Name()Value()性质,因为它们会被处理时使用ComboBoxFor()

这将负责将控件绑定到模型,并允许您使用验证。另外,我在模型中错过了一件事情:你会想要另一个属性的实际值(除了选项)。我会做这样的事情:

public List<Guid> RoleIds { get; set; } // or List<int> if you're using integers 

,然后改变你的ComboBoxFor到ComboBoxFor(x => x.RoleIds)