1

使用下拉列表客户端编辑模板时,我在控制器中将一个空值传递给我的 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()));
    }
4

2 回答 2

3

如果你想保留所有 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 };
}

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

于 2011-08-23T09:39:18.383 回答
0

首先,您需要将视图中列的名称与编辑模板和控制器操作参数的名称相匹配。我认为 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()));
    }
于 2011-04-28T21:47:46.713 回答