Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc KendoUIDropDownlistForHTML包装器-如何在模型中设置集合的BindTo?而不是ViewData或Viewbag_Asp.net Mvc_Drop Down Menu_Kendo Ui_Asp.net Mvc 5_Kendo Asp.net Mvc - Fatal编程技术网

Asp.net mvc KendoUIDropDownlistForHTML包装器-如何在模型中设置集合的BindTo?而不是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属性以获取该应用程序的角色列表。。。够简单吧 按照我现在设置的方式,选择编辑按钮

我正在学习剑道UI。我们正朝着在MVC应用程序视图中使用剑道UI的方向发展

我试图绑定到剑道网格每一行的模型对象中的集合。我们正在使用EditorTemplate来实现下拉列表,这已经适用于几个更简单的示例

然而,在本例中,我们试图通过该对象中的属性值过滤该下拉菜单的源

模型对象:

我标记****的地方是我希望弄清楚如何使它基于模型对象ApprovlesForUserVM的输入参数实际提取数据。。。正在传递appId属性以获取该应用程序的角色列表。。。够简单吧

按照我现在设置的方式,选择编辑按钮后会显示下拉列表,但下拉列表为空!链接到没有任何内容的下拉列表图像:

我一直试图在editortemplate中更改BindTo以引用Model.approvlesList,但每次都会出现空指针异常,因为我猜模型没有被传递给dropdownlistFor帮助器?不确定

我的团队在如何实现此功能方面遇到了一些困难。我们对剑道的使用都是相当陌生的,因此当涉及到这类情况的来龙去脉时,小组中没有专家

提前感谢您抽出时间阅读此内容!:

编辑:外键方法似乎是实现此功能的最佳方式,但我在尝试从外键html包装器引用集合时遇到了问题。当我回到办公桌前时,我会发布另一段代码片段

使用代码段编辑2:

这是更新后的网格,仅使用.ForeignKey引用而不是.Bound。在本例中,我仍在努力引用ApprovlesForUserVM对象中的对象列表。。。有谁有这样做的语法吗?我在剑道演示中看到的大多数示例都非常简单,它们引用了存储在ViewData或ViewBag中的集合

 @(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>