1. ホーム
  2. c#

[解決済み] モデルの検証を行うために、モデルを剣道のComboboxにバインドする方法は?

2022-01-26 08:33:14

質問

ビューモデルを使用して、クライアントサイドとサーバーサイドの両方でフォームの検証を行おうとしています。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 コンテンツ("1"); return コンテンツ("");

上記のコードはコンパイルできますが、コンボボックスでアイテムが選択されていない場合、コントローラが無効を返すようにできません。

よろしくお願いします。

解決方法は?

もし 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)