Telerik MVC Grid Редактировать шаблон Проблема DropDownList - PullRequest
1 голос
/ 17 января 2011

Я получаю нулевое значение, передаваемое моему ajax .Update ("_ SaveAjaxEditing", "AptProfile") в моем контроллере при использовании клиента Edit Template для выпадающего списка.

в моем 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()));
    }

Ответы [ 2 ]

3 голосов
/ 23 августа 2011

Если вы хотите сохранить все Ajax-ified, вы должны сделать это без использования 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 };
}

Может быть, я немного опоздал, но, надеюсь, это кому-нибудь поможет.

0 голосов
/ 29 апреля 2011

Во-первых, вам необходимо сопоставить имя вашего столбца в представлении с именем вашего шаблона редактирования и параметром действия контроллера. Я не думаю, что параметр 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()));
    }
...