【问题标题】:Telerik MVC Grid Edit Template DropDownList problemTelerik MVC Grid Edit Template DropDownList问题
【发布时间】:2013-05-08 05:47:16
【问题描述】:

当使用下拉列表客户端编辑模板时,我在控制器中将一个空值传递给我的 ajax .Update("_SaveAjaxEditing", "AptProfile")。

我的表格绑定到的 FormViewModel 中的属性:

  [UIHint("BuildingsGrid"), Required]
                [DisplayName("Building ID")]
                 public int BuildingID
                {
                    get;
                    set;
                }).

这是我的看法:

 <%= Html.Telerik().Grid<PayRent.Models.AptProfileFormViewModel1>()
                    .Name("Profiles")
                    .DataKeys(dataKeys => dataKeys.Add(c => c.AptProfileID))
                                    .ToolBar(commands => commands.Insert())
                    .DataBinding(binding => 
                        {
                            binding.Ajax()
                            .Select("GetProfiles", "AptProfile")
                            .Insert("_InsertAjaxEditing", "AptProfile")
                            .Update("_SaveAjaxEditing", "AptProfile")
                            .Delete("_DeleteAjaxEditing", "AptProfile");

                        })

                    .Columns(columns => 
                    {
                        columns.Bound(o => o.AptProfileID);
                        columns.Bound(o => o.BuildingID);
                        columns.Bound(o => o.AptID);
                        columns.Bound(o => o.AptRate);
                        columns.Bound(o => o.AptSize);
                        columns.Bound(o => o.MoveInDate);
                        columns.Command(s =>
                        {
                            s.Edit();
                            s.Delete();


                        });


                    })
                                    .Editable(editing => editing.Mode(GridEditMode.InLine))
                                    .ClientEvents(events => events.OnEdit("onEdit"))
                    .Pageable()
            %>
    </p>

 <script type="text/javascript">

function onEdit(e) {
//            $(e.form).find('#BuildingsGrid').data('tDropDownList').select(function (dataItem) {
//                return dataItem.Text == e.dataItem['BuildingGrid'];
//            });
        }


    </script>



My EditTemplate:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<%= Html.Telerik().DropDownList()
        .Name("BuildingsGrid")
            .BindTo(new SelectList((IEnumerable)ViewData["Buildings"], "BuildingID", "Name"))
%>)

这是我的控制器:

 [AcceptVerbs(HttpVerbs.Post)]
    //[CultureAwareAction]
    [GridAction]
    public ActionResult _SaveAjaxEditing(int id, int? BuildingGrid)
    {
        ApartmentProfileRepository repo = new ApartmentProfileRepository();
        AptProfile profile = repo.Get(id);

        TryUpdateModel(profile);
        repo.Save();
        return View(new GridModel(GetAllProfiles()));
    }

【问题讨论】:

    标签: asp.net-mvc telerik-grid


    【解决方案1】:

    如果你想保留所有 Ajax 化的东西,你必须在不使用 viewbag 的情况下做到这一点。我的组合框位于单独的编辑器模板中。您所要做的就是将 SelectList 作为 JsonResult 返回。也就是说,如果您希望该组合框中的数据在用户在页面上发生变化时,我只建议这样做,因为每次打开组合时它都会调用服务器方法。

    在下面的示例中,因为用户可以在选择类别时在同一页面上添加类别,所以我每次都需要它来访问服务器。但在其他页面上,我使用服务器端绑定(通过 ViewBag/ViewData),这样它只会访问服务器一次。

    我的编辑器模板:

    @(Html.Telerik().ComboBox()
    .Name("YourNameGoesHere")
    .DataBinding(binding => binding.Ajax().Select("SelectCategoriesForComboBox","Shared")))
    

    然后在控制器中:

    public EquipmentEntities db = new EquipmentEntities();
    public List<SelectListItem> CategoryList
    {
        get
        {
            var m = db.Categories
            .Select(e => new{ Id = e.Id, Name = e.Name })
            .OrderBy(e => e.name);
            List<SelectListItem> sl = new SelectListItem(m.ToList(), "Id", "Name").ToList();
    
            //insert a blank item as the first entry
            sl.Insert(0, (new SelectListItem { Text = "", Value = string.Empty }));
            return sl;
        }
    }
    
    [HttpPost]
    public ActionResult SelectCategoryForComboBox()
    {
        return new JsonResult { Data = CategoryList };
    }
    

    也许我有点晚了,但希望它可以帮助别人。

    【讨论】:

      【解决方案2】:

      首先,您需要将视图中列的名称与编辑模板和控制器操作参数的名称相匹配。我不认为 int 参数需要在控制器操作中为空。

      然后在您的控制器操作中,您需要为编辑模板设置 ViewData["Buildings"];然后在返回视图之前选择您的配置文件对象中的当前值。

      例如

      public ActionResult _SaveAjaxEditing(int id, int BuildingsGrid)
          {
              ApartmentProfileRepository repo = new ApartmentProfileRepository();
              AptProfile profile = repo.Get(id);
      
              // Save the building ID in the profile
              profile.BuildingID = BuildingsGrid;
      
              TryUpdateModel(profile);
              repo.Save();
      
              // Load the Building objects into the ViewData
              ViewData["Buildings"] = GetBuildings();
      
              return View(new GridModel(GetAllProfiles()));
          }
      

      【讨论】:

      • Winger,有没有办法在不使用 ViewData 的情况下做到这一点?我试图弄清楚如何通过访问我的模型上的 SelectList 属性来完成此操作,但无法解决。
      • campbelt,如何使用辅助对象返回可枚举的 Building 对象列表。在编辑模板中,将 ViewData 替换为您的帮助程序类方法。请记住,这只会在绑定网格数据之前渲染一次,然后对每一行使用相同的列表。
      • 谢谢,边锋。我会调查的。与此同时,你有没有碰巧知道我可以看到的这类事情的一个很好的例子?
      • 我见过的最完整的例子是 Telerik 的在线演示:demos.telerik.com/aspnet-mvc/grid/clientedittemplates。希望这会有所帮助!
      • 我也有同样的问题。我跟着第一和第二。但我没有在下拉列表中获得新选择的值。这里的代码几乎相同。唯一的区别是我使用服务器(不是 ajax)绑定。 demos.telerik.com/aspnet-mvc/grid/clientedittemplates。这是我的问题stackoverflow.com/questions/12198163/…
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-07
      • 2011-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 2014-11-02
      相关资源
      最近更新 更多