Asp.net mvc 什么;“编辑视图数据”;在Telerik MVC网格列定义中是否为?

Asp.net mvc 什么;“编辑视图数据”;在Telerik MVC网格列定义中是否为?,asp.net-mvc,telerik,kendo-ui,Asp.net Mvc,Telerik,Kendo Ui,我有一个telerik网格,如下所示: Html.Telerik().Grid<MatchViewModel>().Name("Matches").Columns(cols => { cols.Bound(e => e.Name); cols.Bound(e => e.Date); cols.Bound(e => e.GuestTea

我有一个telerik网格,如下所示:

Html.Telerik().Grid<MatchViewModel>().Name("Matches").Columns(cols =>
             {
                 cols.Bound(e => e.Name);
                 cols.Bound(e => e.Date);
                 cols.Bound(e => e.GuestTeamId);
                 cols.Bound(e => e.HostTeamId);
                 cols.Bound(e => e.PostponedDate);
             ==> cols.Bound(e => e.RefereeId).EditorViewData(new { RefereeName = '' });
                 cols.Bound(e => e.StatusId);
             })
Html.Telerik().Grid().Name(“匹配”).Columns(cols=>
{
cols.Bound(e=>e.Name);
cols.Bound(e=>e.Date);
cols.Bound(e=>e.GuestTeamId);
cols.Bound(e=>e.HostTeamId);
cols.Bound(e=>e.PostponedDate);
==>cols.Bound(e=>e.referedid.EditorViewData(新的{referediname='''});
cols.Bound(e=>e.StatusId);
})
在arrow引用的列中,我想发送仲裁人名称作为EditorTemplate的附加数据。我从
EditorViewData
方法名称推断,它可以帮助我完成此操作。但我无法让它工作。有人能帮我吗?
谢谢。

如果你的页面有一个定义良好的模型,你就永远不需要使用ViewBag或ViewData,因为它们太草率了。EditorViewData允许您动态创建ViewData,以便将额外数据传递给EditorTemplate

例如,假设您希望在EditorTemplate中为网格中的每个项目提供不同的DropDownList值,则需要传递额外的数据才能做到这一点。使用EditorViewData,您可以从模型中添加其他值,而无需对控制器中的任何ViewBag或ViewData对象进行编码

我使用它的第一个地方是人员网格,它允许编辑添加到嵌套TabStrip中的资格网格中的已定义资格。诀窍是我不希望每个人的下拉列表包含他们已经获得的任何资格。像这样

人脉 嵌套网格(视图加载在TabStrip中) 控制器方法(仅供参考)
public JsonResult ReadDdlQualifications(int personId)
{
var qualification=\u qualificationDataProvider.ReadAvailableToPerson(personId);
IList results=IdNamePair.flatttothis(资格);
返回Json(结果,JsonRequestBehavior.AllowGet);
}
很明显,在这个例子中还有很多其他的东西(我希望我留下了足够的代码让它有意义),但是它应该能够理解什么时候需要它,什么时候真的需要它


享受。

我遇到了与Chad相同的问题,正如Trey提到的,这不能通过将信息传递给编辑视图数据来实现。无法传递行数据项,只能传递页面数据

或者,您可以将此脚本添加到编辑器模板中。然后,您可以从网格行访问字段值并将其传递给数据源调用,根据每行数据过滤dropdownlist。

<script type="text/javascript">

    function getParentId() {
        var row = $(event.srcElement).closest("tr");
        var grid = $(event.srcElement).closest("[data-role=grid]").data("kendoGrid");
        var dataItem = grid.dataItem(row);
        return { EmployeeId: dataItem.EmployeeId };
    }

</script>

在EditorViewModel中指定的模型引用传入的页面级模型。在我的例子中,页面具有主数据,网格表示详细数据,因此我的DDL选项填充在网格的视图模型中,而不是页面视图模型中。如何引用网格的视图模型?我想我理解您的意图,为每一行设置一个下拉列表,其值取决于该行。不幸的是,这似乎超出了这种控制方式的能力。您可以进行弹出式编辑或ClientDetailTemplate。如果你一定要做你描述的演讲,我个人会放弃剑道格网。动态构建一个表和任何脚本,然后根据需要将其样式设置为剑道样式。我也可能很懒惰,让它成批编辑,所以你可以看到所有的下拉列表,并将它们保存在一个大的Ajax表单中,但你也可以一个接一个地做。
public class PeopleViewModel : PageViewModel
{
    public int PersonId { get; set; }
    public PersonModel Person { get; set; }
    public IList<QualificationModel> AllQualifications { get; set; }
...

    public PeopleViewModel(BaseViewModel baseViewModel) : base(baseViewModel)
    {}
}
public ActionResult PersonQualifications(int personId)
{
    SetBaseContext(HttpContext);
    var model = new PeopleViewModel(BaseViewModel)
                     {
                        PersonId = personId,
                        AllQualifications = QualificationModel.FlattenToThis(_qualificationDataProvider.Read())
                     };
    return View(model);
}
@using Kendo.Mvc.UI
@model PeopleViewModel
@{
    Layout = null;
}
@(Html.Kendo().Grid<PersonQualificationModel>()
    .Name("QualificationEditGrid_" + Model.PersonId)
    .Columns(columns =>
    {
        columns.ForeignKey(f => f.QualificationId, Model.AllQualifications, "Id", "Display")
===>        .EditorViewData(new {personId = Model.PersonId})
            .EditorTemplateName("PersonQualificationDropDownList");
        columns.Command(cmd =>
                            {
                                cmd.Edit();
                                cmd.Destroy();
                                }).Width(180);
    })
    .ToolBar(toolbar => toolbar.Create())
    .DataSource(dataSource => dataSource
        .Ajax()
        .Events(events => events.Error("error_handler"))
        .Model(model => {
            model.Id(a => a.Id);
        })
        .Create(create => create.Action("CreatePersonQualification", "People"))
        .Read(read => read.Action("ReadPersonQualifications", "People", new {personId = Model.PersonId}))   
        .Destroy(destroy => destroy.Action("DestroyPersonQualification", "People"))
    )
)
@using Kendo.Mvc.UI
@(Html.Kendo().DropDownList()
    .Name(ViewData.TemplateInfo.GetFullHtmlFieldName(""))
    .DataValueField("Id")
    .DataTextField("Name")
    .OptionLabel("Select...")
    .DataSource(dataSource => dataSource
===>    .Read(read => read.Action("ReadDdlQualifications", "People", new {personId = ViewData["personId"]}))
    )
)
public JsonResult ReadDdlQualifications(int personId)
{
    var qualification = _qualificationDataProvider.ReadAvailableToPerson(personId);
    IList<IdNamePair> results = IdNamePair.FlattenToThis(qualification);
    return Json(results, JsonRequestBehavior.AllowGet);
}
<script type="text/javascript">

    function getParentId() {
        var row = $(event.srcElement).closest("tr");
        var grid = $(event.srcElement).closest("[data-role=grid]").data("kendoGrid");
        var dataItem = grid.dataItem(row);
        return { EmployeeId: dataItem.EmployeeId };
    }

</script>
@(Html.Kendo().DropDownList()
        .Name("Product")
        .DataValueField("ProductId")
        .DataTextField("ProductName")
        .DataSource(ds => ds
            .Read(read => read.Action("ProductsRead", "Home")
                .Data("getParentId")
                ))
)