2011-01-17 19 views
1

ドロップダウンリストクライアントのテンプレートを編集するときに、私のコントローラで、私のajax .Update( "_ SaveAjaxEditing"、 "AptProfile")にnull値が渡されています。私のグリッドがバインドされている私のFormViewModelでTelerik MVCグリッド編集テンプレートDropDownListの問題

プロパティ:ここ

[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パラメータがコントローラアクションでnullableである必要があるとは思わない。

次に、コントローラのアクションで、編集テンプレートの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、ヘルパーオブジェクトを使用してBuildingオブジェクトの列挙可能なリストを返すのはどうですか?編集テンプレートで、ViewDataをヘルパークラスメソッドに置き換えます。これは、グリッドデータがバインドされる前に一度レンダリングされた後、同じリストが各行に使用されることを覚えておいてください。 – Winger

+0

ありがとう、ウィンガー。私はそれを調べます。その間に、私が見ることができるこのような事の良い例を知っていますか? – campbelt

3

すべてのAjaxを保持したい場合は、ビューバックを使用せずに行う必要があります。私のコンボボックスは別のエディタテンプレートにあります。 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 }; 
} 

たぶん私は少し遅れてんだけど、うまくいけば、それが誰かを助けます。

関連する問題