如何在网格列的下拉编辑器中显示默认值

发布于 2025-01-25 14:44:23 字数 3050 浏览 3 评论 0 原文

这是我的网格:

var grid = Html.Kendo().Grid<UserVM>()
    .Name("Grid")
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(events => events.Error("gridError"))
        .PageSize(10)
        .ServerOperation(false)
        .Model(model =>
        {
            model.Id(e => e.Id);
            model.Field(e => e.Role).DefaultValue((RoleVM)ViewData["DefaultRole"]);
        })
        .Read("Read", "GeneralInformation")
        .Create("Read", "GeneralInformation")
        .Update("Update", "GeneralInformation")
        .Destroy("Delete", "GeneralInformation")
    )
    .Columns(columns =>
    {
        columns.Bound(e => e.FullName).Title(_userLocalizer["Full name"]);
        columns.Bound(e => e.Role.Name).Title(_userLocalizer["Role"]).EditorTemplateName("RoleEditor");
        columns.Bound(e => e.Position).Title(_userLocalizer["Position"]);
        columns.Bound(e => e.PhoneNumber).Title(_userLocalizer["Phone number"]);
        columns.Bound(e => e.Email).Title(_userLocalizer["Email"]);
    })
    .Editable(GridEditMode.InLine)
    .Sortable()
    .Pageable(pager => pager
        .Input(true)
        .PageSizes(true)
    )
    .Scrollable(scroll => scroll
        .Virtual(GridVirtualizationMode.RowsAndColumns)
    );

我使用编辑器来选择角色。如您所见,我尝试在 dataSource 模型上指定默认值,但它行不通。

colevm

public class RoleVM
{
    public string Name { get; set; }
    public string Value { get; set; }

    public RoleVM(string name, string value)
    {
        Name = name;
        Value = value;
    }
}

coleditor

@(Html.Kendo().DropDownList()
    .Name("Employee")
    .DataTextField("Name")
    .DataValueField("Value")
    .BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
    )

uservm

public class UserVM
{
    public int? Id { get; set; }
    public List<ApplicationVM> Applications { get; set; }

    [Required(ErrorMessage = "Full name required")]
    public string FullName { get; set; }

    [Required(ErrorMessage = "Role required")]
    public RoleVM Role { get; set; }

    [Required(ErrorMessage = "Position required")]
    public string Position { get; set; }

    [Required(ErrorMessage = "Phone number required")]
    [Phone]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Email required")]
    [EmailAddress(ErrorMessage = "Email invalid")]
    public string Email { get; set; }
}

控制器的操作填充数据:

public IActionResult Index()
{
    var roles = Static.Roles.Select(role => new RoleVM(_staticLocalizer[role].Value, role));
    ViewData["Roles"] = roles;
    ViewData["DefaultRole"] = roles.Last();
    return View();
}

This is my grid:

var grid = Html.Kendo().Grid<UserVM>()
    .Name("Grid")
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(events => events.Error("gridError"))
        .PageSize(10)
        .ServerOperation(false)
        .Model(model =>
        {
            model.Id(e => e.Id);
            model.Field(e => e.Role).DefaultValue((RoleVM)ViewData["DefaultRole"]);
        })
        .Read("Read", "GeneralInformation")
        .Create("Read", "GeneralInformation")
        .Update("Update", "GeneralInformation")
        .Destroy("Delete", "GeneralInformation")
    )
    .Columns(columns =>
    {
        columns.Bound(e => e.FullName).Title(_userLocalizer["Full name"]);
        columns.Bound(e => e.Role.Name).Title(_userLocalizer["Role"]).EditorTemplateName("RoleEditor");
        columns.Bound(e => e.Position).Title(_userLocalizer["Position"]);
        columns.Bound(e => e.PhoneNumber).Title(_userLocalizer["Phone number"]);
        columns.Bound(e => e.Email).Title(_userLocalizer["Email"]);
    })
    .Editable(GridEditMode.InLine)
    .Sortable()
    .Pageable(pager => pager
        .Input(true)
        .PageSizes(true)
    )
    .Scrollable(scroll => scroll
        .Virtual(GridVirtualizationMode.RowsAndColumns)
    );

I use editor for choosing a role. As you can see, I tried to specify the default value on Datasource Model, but it doesn't work.

RoleVM:

public class RoleVM
{
    public string Name { get; set; }
    public string Value { get; set; }

    public RoleVM(string name, string value)
    {
        Name = name;
        Value = value;
    }
}

RoleEditor:

@(Html.Kendo().DropDownList()
    .Name("Employee")
    .DataTextField("Name")
    .DataValueField("Value")
    .BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
    )

UserVM:

public class UserVM
{
    public int? Id { get; set; }
    public List<ApplicationVM> Applications { get; set; }

    [Required(ErrorMessage = "Full name required")]
    public string FullName { get; set; }

    [Required(ErrorMessage = "Role required")]
    public RoleVM Role { get; set; }

    [Required(ErrorMessage = "Position required")]
    public string Position { get; set; }

    [Required(ErrorMessage = "Phone number required")]
    [Phone]
    public string PhoneNumber { get; set; }

    [Required(ErrorMessage = "Email required")]
    [EmailAddress(ErrorMessage = "Email invalid")]
    public string Email { get; set; }
}

Controller's action filling data:

public IActionResult Index()
{
    var roles = Static.Roles.Select(role => new RoleVM(_staticLocalizer[role].Value, role));
    ViewData["Roles"] = roles;
    ViewData["DefaultRole"] = roles.Last();
    return View();
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

长发绾君心 2025-02-01 14:44:23

您可以将列绑定到角色对象而不是其名称属性,并添加clienttemplate显示名称:

columns.Bound(e => e.Role).Title(_userLocalizer["Role"]).ClientTemplate("#=Role.Name#").EditorTemplateName("RoleEditor");

然后更新coleditor:

@model RoleVM

@(Html.Kendo().DropDownListFor(m=>m)
.DataTextField("Name")
.DataValueField("Value")
.BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
)

如果您需要保持开箱即用的过滤器工作,则也可以使用 mvvm 配置绑定。按照您已经定义了列配置:

columns.Bound(e => e.Role.Name).Title(_userLocalizer["Role"]).EditorTemplateName("RoleEditor");

通过数据绑定属性将编辑器模板绑定到整个对象:

@(Html.Kendo().DropDownList()
.Name("Employee")
.DataTextField("Name")
.DataValueField("Value")
.BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
.HtmlAttributes(new {data_bind="value:Role"})
)

You can bind the column to the Role object rather than it's Name property and add a ClientTemplate to display the Name:

columns.Bound(e => e.Role).Title(_userLocalizer["Role"]).ClientTemplate("#=Role.Name#").EditorTemplateName("RoleEditor");

Then update the RoleEditor:

@model RoleVM

@(Html.Kendo().DropDownListFor(m=>m)
.DataTextField("Name")
.DataValueField("Value")
.BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
)

If you need to keep the out-of-the-box filter working you can also use MVVM to configure the binding. Keep the column configuration as you already have it defined:

columns.Bound(e => e.Role.Name).Title(_userLocalizer["Role"]).EditorTemplateName("RoleEditor");

and bind the editor template to the whole object via the data-bind attribute:

@(Html.Kendo().DropDownList()
.Name("Employee")
.DataTextField("Name")
.DataValueField("Value")
.BindTo((IEnumerable<RoleVM>) ViewData["Roles"])
.HtmlAttributes(new {data_bind="value:Role"})
)
乞讨 2025-02-01 14:44:23

补充@aleksandar答案。添加过滤的正确方法是:

.Search(c => { c.Field(e => e.Role.Name, "startswith"); })

并且列需要将其限制到 roun

columns.Bound(e => e.Role)

此, data-Bind 属性是没有用的。

Addition to the @Aleksandar answer. The correct way to add filtering is:

.Search(c => { c.Field(e => e.Role.Name, "startswith"); })

And column need to be bounded to Role:

columns.Bound(e => e.Role)

And with this, data-bind attribute is useless.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文