Asp.net mvc KendoUIDropDownlistForHTML包装器-如何在模型中设置集合的BindTo?而不是ViewData或Viewbag
我正在学习剑道UI。我们正朝着在MVC应用程序视图中使用剑道UI的方向发展 我试图绑定到剑道网格每一行的模型对象中的集合。我们正在使用EditorTemplate来实现下拉列表,这已经适用于几个更简单的示例 然而,在本例中,我们试图通过该对象中的属性值过滤该下拉菜单的源 模型对象: 我标记****的地方是我希望弄清楚如何使它基于模型对象ApprovlesForUserVM的输入参数实际提取数据。。。正在传递appId属性以获取该应用程序的角色列表。。。够简单吧 按照我现在设置的方式,选择编辑按钮后会显示下拉列表,但下拉列表为空!链接到没有任何内容的下拉列表图像: 我一直试图在editortemplate中更改BindTo以引用Model.approvlesList,但每次都会出现空指针异常,因为我猜模型没有被传递给dropdownlistFor帮助器?不确定 我的团队在如何实现此功能方面遇到了一些困难。我们对剑道的使用都是相当陌生的,因此当涉及到这类情况的来龙去脉时,小组中没有专家 提前感谢您抽出时间阅读此内容!: 编辑:外键方法似乎是实现此功能的最佳方式,但我在尝试从外键html包装器引用集合时遇到了问题。当我回到办公桌前时,我会发布另一段代码片段 使用代码段编辑2: 这是更新后的网格,仅使用.ForeignKey引用而不是.Bound。在本例中,我仍在努力引用ApprovlesForUserVM对象中的对象列表。。。有谁有这样做的语法吗?我在剑道演示中看到的大多数示例都非常简单,它们引用了存储在ViewData或ViewBag中的集合Asp.net mvc KendoUIDropDownlistForHTML包装器-如何在模型中设置集合的BindTo?而不是ViewData或Viewbag,asp.net-mvc,drop-down-menu,kendo-ui,asp.net-mvc-5,kendo-asp.net-mvc,Asp.net Mvc,Drop Down Menu,Kendo Ui,Asp.net Mvc 5,Kendo Asp.net Mvc,我正在学习剑道UI。我们正朝着在MVC应用程序视图中使用剑道UI的方向发展 我试图绑定到剑道网格每一行的模型对象中的集合。我们正在使用EditorTemplate来实现下拉列表,这已经适用于几个更简单的示例 然而,在本例中,我们试图通过该对象中的属性值过滤该下拉菜单的源 模型对象: 我标记****的地方是我希望弄清楚如何使它基于模型对象ApprovlesForUserVM的输入参数实际提取数据。。。正在传递appId属性以获取该应用程序的角色列表。。。够简单吧 按照我现在设置的方式,选择编辑按钮
@(Html.Kendo().Grid<AppRolesForUserVM>()
.Name("ApplicationGrid")
.Columns(columns =>
{
columns.Bound(p => p.AppId).Title("Application Id").Width(50);
columns.Bound(p => p.appName).Title("Application Name").Width(100);
columns.ForeignKey(p => p.appRole.Id, q.appRolesList).ClientTemplate("#=appRole.Name#").Title("App Role").Width(100);
我没有使用EditorTemplate完成此操作,但另一个选项是创建一个返回角色的控制器操作并使用它:
public JsonResult ReadRoles(int id)
{
var roleList = context.Roles.Where(r => r.AppId == id).OrderBy(r => r.Name).ToSelectList(r => r.Id.ToString(), r => r.Name);
var result = Json(roleList, JsonRequestBehavior.AllowGet);
return result;
}
然后,您的下拉列表会变成:
@(Html.Kendo().DropDownListFor(p => p.appRole.Id)
.Name("appRole.Id")
.DataSource(source => source.Read(read => read.Action("ReadRoles", "App", new { id = @Model.AppId })
.DataTextField("Name")
.DataValueField("Id")
.HtmlAttributes(new {data_value_primitive = "true"})
)
其中App是您将read操作放入的控制器,ToSelectList是我们编写的用于创建IEnumerable的扩展方法
使用我能够使用的最后一种方法进行编辑:我已经使用了这种方法,它使用了与此答案中类似的方法,只是稍微调整了一下
我现在使用的下拉编辑器模板代码是:
@model Project.Models.ViewModels.AppRolesForUserVM
@(Html.Kendo().DropDownListFor(p => p.appRole.Id)
.Name("appRole.Id")
.DataSource(source => source.Read(read => read.Action("ReadRoles", "App").Data("onRead")))
.DataTextField("Name")
.DataValueField("Id")
.HtmlAttributes(new { data_value_primitive = "true" })
)
数据源声明中的.DataonRead调用以下函数,该函数获取正在编辑的数据行,然后从该行的第一列获取值;其中包含要传递给控制器读取操作的ID:
<script type="text/javascript">
function onRead(e) {
var row = $(event.currentTarget).find(".k-grid-edit-row");
var id = row.find("td:first").html();
return { id: id };
}
</script>
是否有名为ListOfRoles的ViewData项?您的模型显示您有一个属性列表ApprovalList,我假设它是您想要为选项显示的属性列表?ForeignKey列类型不允许您指定数据源吗。。为什么不使用它呢?Jamied77,我不知道这个功能,谢谢!:。。。斯蒂芬,是的,计划就是使用批准名单。我的视图模型已经在ApprovalList中包含了过滤列表,所以希望在编辑器模板的模型对象中指向该列表是可行的?在尝试插入该值时,我遇到了空指针异常。8^/那么它不是.BindTop=>p.approvleslist吗?我回到办公室后会尝试这种语法。谢谢你,斯蒂芬!我要试试这个!!感谢您通读此问题并提出答案。我认为这可能只是一张罚单……似乎引用模型是行不通的,因为显然模型没有传递到编辑器模板,而是仅用于元数据,如:。这个链接提供了使用一个小javascript方法从网格传递值的替代方法。看起来这很有希望,现在我正在实现语法来获取父对象,然后从该对象获取ID字段。显然,剑道网格在默认情况下并没有设置对象的ID或名称,所以我必须通过HtmLatAttributes来实现这一点。看看这里和这里的EditorViewData Steve Greene,我真的很感谢您的跟进!今天下午我要试一试,看看我能做些什么。星期五快乐好啊我终于成功了。我用来获取该数据方法的值的jquery是:function onReade{var row=$event.currentTarget.find.k-grid-edit-row;var id=row.findtd:first.html;return{id:id};}如果其他人遇到这个问题,我希望这能帮助他们!再次感谢史蒂夫·格林
@(Html.Kendo().DropDownListFor(p => p.appRole.Id)
.Name("appRole.Id")
.DataSource(source => source.Read(read => read.Action("ReadRoles", "App", new { id = @Model.AppId })
.DataTextField("Name")
.DataValueField("Id")
.HtmlAttributes(new {data_value_primitive = "true"})
)
@model Project.Models.ViewModels.AppRolesForUserVM
@(Html.Kendo().DropDownListFor(p => p.appRole.Id)
.Name("appRole.Id")
.DataSource(source => source.Read(read => read.Action("ReadRoles", "App").Data("onRead")))
.DataTextField("Name")
.DataValueField("Id")
.HtmlAttributes(new { data_value_primitive = "true" })
)
<script type="text/javascript">
function onRead(e) {
var row = $(event.currentTarget).find(".k-grid-edit-row");
var id = row.find("td:first").html();
return { id: id };
}
</script>