我如何将自定义按钮添加到打开新页面的 razor pages .net core 3.1 项目中的 kendo 网格
How can i add a custom button to a kendo grid in a razor pages .net core 3.1 project that opens a new page
我有一个仅供查看的 ajax 绑定 kendo 网格,从名为 Notes 的较大数据库模型中读取多个字段。
我需要一个 link 或每行上的一个按钮来打开编辑页面,以便可以编辑所有字段,只记下网格中的字段,并向其传递一个 ID 和可能的另一个参数以及。编辑页面包括许多多对多下拉菜单和树视图等。
作为一个 ajax 绑定网格,我相信您只能在绑定列中使用 ClientTemplate,而不是 Template,如果这样做的话。
使用带有 .NETCore3.1 的剃刀页面项目,因此没有控制器,我所在的页面是 Index.cshtml,由 Index.cshtml.cs[=12 支持=]
非常感谢任何帮助,我对此有点陌生。谢谢
这是网格:
@(Html.Kendo().Grid<Note>().Name("grid")
.Groupable()
.Sortable()
.Scrollable()
.ToolBar(x =>
{
x.Excel();
})
.Columns(columns =>
{
columns.Bound(p => p.NoteDate).Title("Note Date").Format("{0:dd/MM/yyyy}");
columns.Bound(p => p.Title).Title("Title");
columns.Bound(p => p.NoteText).Title("Note Detail");
columns.Bound(p => p.Amount).Title("Amount");
columns.Bound(p => p.DateCreated).Title("Created");
//something like this, but this just takes me to the page im already on
columns.Bound(p => p.ID).ClientTemplate(
"<a href='" +
Url.Action("Edit", "/Notes/Edit") +
"'/#= ID #'" +
">Edit</a>"
);
columns.Command(column =>
{
//Or something like this
//column.Custom("Edit").Click("Open Notes/Edit")
//.HtmlAttributes(new { @Id = "#= ID" });}).Width(166);
});
})
.DataSource(ds => ds.Ajax()
.Read(r => r.Url("/Notes/Index?handler=Read").Data("forgeryToken"))
.Model(m => m.Id(id => id.ID))
.PageSize(10)
)
.Pageable()
)
有几种方法可以做到这一点。这种方式可能会给你最大的灵活性,也是我最喜欢的方式:
columns.Template("<a class='btn' href='javascript:myJavascriptAjaxFunction(#=ID#)'>Edit</a>");
如果您想使用列命令路由,首先您必须使您的网格可编辑,然后您必须使用编辑命令,然后您需要创建一个事件将调用 Javascript 函数,您可以在其中编写代码。 Javascript 函数会传入一个参数,例如 "e",然后您可以使用该参数来访问行的模型信息等信息。
有 3 种编辑类型:批处理、内联或 popup.Which 编辑类型将决定事件。下面是 Kendo 的一些很好的例子的演示文档:https://demos.telerik.com/aspnet-mvc/grid/editing-popup
下面是弹出窗口编辑的示例:
@(Html.Kendo().Grid<Note>().Name("grid")
.Groupable()
.Sortable()
.Scrollable()
.Editable(editable => editable.Mode(GridEditMode.PopUp))
.Events(e=>e.Edit("myJavascriptAjaxFunction"))
.ToolBar(x =>
{
x.Excel();
})
.Columns(columns =>
{
columns.Bound(p => p.NoteDate).Title("Note Date").Format("{0:dd/MM/yyyy}");
columns.Bound(p => p.Title).Title("Title");
columns.Bound(p => p.NoteText).Title("Note Detail");
columns.Bound(p => p.Amount).Title("Amount");
columns.Bound(p => p.DateCreated).Title("Created");
//something like this, but this just takes me to the page im already on
columns.Bound(p => p.ID).ClientTemplate(
"<a href='" +
Url.Action("Edit", "/Notes/Edit") +
"'/#= ID #'" +
">Edit</a>"
);
columns.Command(column => column.Edit());
})
.DataSource(ds => ds.Ajax()
.Read(r => r.Url("/Notes/Index?handler=Read").Data("forgeryToken"))
.Model(m => m.Id(id => id.ID))
.PageSize(10)
)
.Pageable()
)
更新:
同样,您可以通过多种方式解决此问题,但一种方法是使用 Javascript 函数进行 ajax 调用 returns 可以在 [=37= 中显示的部分视图] 模态。
Bootstrap 模态文档:https://getbootstrap.com/docs/4.0/components/modal/
确保您的项目中包含 bootstrap 并将其添加到您的剃刀视图中:
<div class="modal" tabindex="-1" role="dialog" id="myModal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Modal body text goes here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
在你的 Javascript:
myJavascriptFunction(id){
$.ajax({
type: "GET", //make sure matches your controller http request
url: "/Notes/Edit/"+id
success: function (content) {
$('.modal-body').html(content);
$('#myModal').modal('toggle'); //to show the modal
},
error: function (req, status, error) {
alert(error);
}
});
我有一个仅供查看的 ajax 绑定 kendo 网格,从名为 Notes 的较大数据库模型中读取多个字段。
我需要一个 link 或每行上的一个按钮来打开编辑页面,以便可以编辑所有字段,只记下网格中的字段,并向其传递一个 ID 和可能的另一个参数以及。编辑页面包括许多多对多下拉菜单和树视图等。
作为一个 ajax 绑定网格,我相信您只能在绑定列中使用 ClientTemplate,而不是 Template,如果这样做的话。
使用带有 .NETCore3.1 的剃刀页面项目,因此没有控制器,我所在的页面是 Index.cshtml,由 Index.cshtml.cs[=12 支持=]
非常感谢任何帮助,我对此有点陌生。谢谢
这是网格:
@(Html.Kendo().Grid<Note>().Name("grid")
.Groupable()
.Sortable()
.Scrollable()
.ToolBar(x =>
{
x.Excel();
})
.Columns(columns =>
{
columns.Bound(p => p.NoteDate).Title("Note Date").Format("{0:dd/MM/yyyy}");
columns.Bound(p => p.Title).Title("Title");
columns.Bound(p => p.NoteText).Title("Note Detail");
columns.Bound(p => p.Amount).Title("Amount");
columns.Bound(p => p.DateCreated).Title("Created");
//something like this, but this just takes me to the page im already on
columns.Bound(p => p.ID).ClientTemplate(
"<a href='" +
Url.Action("Edit", "/Notes/Edit") +
"'/#= ID #'" +
">Edit</a>"
);
columns.Command(column =>
{
//Or something like this
//column.Custom("Edit").Click("Open Notes/Edit")
//.HtmlAttributes(new { @Id = "#= ID" });}).Width(166);
});
})
.DataSource(ds => ds.Ajax()
.Read(r => r.Url("/Notes/Index?handler=Read").Data("forgeryToken"))
.Model(m => m.Id(id => id.ID))
.PageSize(10)
)
.Pageable()
)
有几种方法可以做到这一点。这种方式可能会给你最大的灵活性,也是我最喜欢的方式:
columns.Template("<a class='btn' href='javascript:myJavascriptAjaxFunction(#=ID#)'>Edit</a>");
如果您想使用列命令路由,首先您必须使您的网格可编辑,然后您必须使用编辑命令,然后您需要创建一个事件将调用 Javascript 函数,您可以在其中编写代码。 Javascript 函数会传入一个参数,例如 "e",然后您可以使用该参数来访问行的模型信息等信息。
有 3 种编辑类型:批处理、内联或 popup.Which 编辑类型将决定事件。下面是 Kendo 的一些很好的例子的演示文档:https://demos.telerik.com/aspnet-mvc/grid/editing-popup
下面是弹出窗口编辑的示例:
@(Html.Kendo().Grid<Note>().Name("grid")
.Groupable()
.Sortable()
.Scrollable()
.Editable(editable => editable.Mode(GridEditMode.PopUp))
.Events(e=>e.Edit("myJavascriptAjaxFunction"))
.ToolBar(x =>
{
x.Excel();
})
.Columns(columns =>
{
columns.Bound(p => p.NoteDate).Title("Note Date").Format("{0:dd/MM/yyyy}");
columns.Bound(p => p.Title).Title("Title");
columns.Bound(p => p.NoteText).Title("Note Detail");
columns.Bound(p => p.Amount).Title("Amount");
columns.Bound(p => p.DateCreated).Title("Created");
//something like this, but this just takes me to the page im already on
columns.Bound(p => p.ID).ClientTemplate(
"<a href='" +
Url.Action("Edit", "/Notes/Edit") +
"'/#= ID #'" +
">Edit</a>"
);
columns.Command(column => column.Edit());
})
.DataSource(ds => ds.Ajax()
.Read(r => r.Url("/Notes/Index?handler=Read").Data("forgeryToken"))
.Model(m => m.Id(id => id.ID))
.PageSize(10)
)
.Pageable()
)
更新: 同样,您可以通过多种方式解决此问题,但一种方法是使用 Javascript 函数进行 ajax 调用 returns 可以在 [=37= 中显示的部分视图] 模态。
Bootstrap 模态文档:https://getbootstrap.com/docs/4.0/components/modal/
确保您的项目中包含 bootstrap 并将其添加到您的剃刀视图中:
<div class="modal" tabindex="-1" role="dialog" id="myModal">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Modal title</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<p>Modal body text goes here.</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-primary">Save changes</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
在你的 Javascript:
myJavascriptFunction(id){
$.ajax({
type: "GET", //make sure matches your controller http request
url: "/Notes/Edit/"+id
success: function (content) {
$('.modal-body').html(content);
$('#myModal').modal('toggle'); //to show the modal
},
error: function (req, status, error) {
alert(error);
}
});