2011-01-17 3 views
1

Я получаю пустое значение, переданное в мой ajax .Update ("_ SaveAjaxEditing", "AptProfile") в моем контроллере при использовании клика EditData.Telerik MVC Grid Редактировать Шаблон DropDownList проблема

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

ответ

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())); 
    } 
+0

Winger, есть ли способ сделать это без использования ViewData? Я пытаюсь понять, как это сделать, получив доступ к свойству SelectList на моей модели, но не могу это решить. – campbelt

+1

campbelt, как насчет использования вспомогательного объекта для возврата перечислимого списка объектов здания. В шаблоне редактирования замените ViewData на метод вспомогательного класса. Просто помните, что это делается только один раз, прежде чем данные сетки привязаны, а затем тот же список используется для каждой строки. – Winger

+0

Спасибо, Вингер. Я займусь этим. А пока, знаете ли вы, что это хороший пример такого рода вещей, на который я могу смотреть? – campbelt

3

Если вы хотите сохранить все Ajax-ified, вы можете сделать это, не используя сумку. Моя combobox находится в отдельном шаблоне редактора. Все, что вам нужно сделать, это вернуть SelectList как JsonResult. Тем не менее, я только рекомендовал сделать это таким образом, если вы ожидаете, что данные в этой combobox будут изменены, пока пользователь находится на странице, потому что он вызывает метод сервера каждый раз, когда комбо открывается.

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

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

Смежные вопросы