2

ビューモデルを使用して、クライアント側とサーバー側の両方でフォームを検証しようとしています。Kendo Combobox を除いて、すべての検証が機能しています。モデルを複数選択にバインドしましたが、リストと選択された値を区別する方法がわかりません。

コンボボックス:

@(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] public ContentResult RoleRequest(AddRoleRequestViewModel viewModel) { if (ModelState.IsValid) { return Content("1"); コンテンツを返します(""); }

上記のコードはコンパイルされますが、コンボボックスでアイテムが選択されていない場合、コントローラーが無効を返すことはできません。誰でもこれを修正する方法を説明できますか?

どんな助けでも大歓迎です。

4

1 に答える 1

4

使用する場合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()

これにより、コントロールがモデルにバインドされ、検証を使用できるようになります。

また、モデルで見逃していたことが 1 つあります。実際の値には別のプロパティが必要です (オプションだけでなく)。私はこのようなことをします:

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

次に、ComboBoxForをに変更しますComboBoxFor(x => x.RoleIds)

于 2015-01-02T17:13:23.047 に答える