2012-05-31 75 views
1

我想在Razor中創建一個Ajax Telerik網格,該網格有一個可更新的外鍵列,顯示下拉列表。我非常喜歡這個例子複製我的頁面,並且一切正常。我可以添加新記錄,刪除它們並編輯它們。唯一不起作用的是當我在網格中更新記錄時,我得到一個帶有整數的文本字段,而不是具有外鍵表的所有可能性的下拉列表。ASP.NET MVC 3 Telerik Razor網格與可編輯的外鍵下拉列

任何人有任何想法如何解決這個問題?見下面的代碼。

Telerik的網格:

@(Html.Telerik().Grid<EditableAccount>() 
    .Name("Grid") 
    .ToolBar(commands => commands.Insert().ButtonType(GridButtonType.Text).ImageHtmlAttributes(new { style = "margin-left:0" })) 
    .DataBinding(dataBinding => dataBinding.Ajax() 
     .Insert("InsertAccount", "Administration") 
     .Update("SaveAccount", "Administration") 
     .Delete("DeleteAccount", "Administration")) 
    .DataKeys(keys => { keys.Add(a => a.AccountId); }) 
    .Columns(columns => 
    { 
     columns.ForeignKey(b => b.BankId, (IEnumerable)ViewData["Banks"], "ID", "Name").Width(50); 
     columns.Bound(a => a.AccountNumber).Width(110); 
     columns.Command(commands => 
     { 
      commands.Edit().ButtonType(GridButtonType.Image); 
      commands.Delete().ButtonType(GridButtonType.Image); 
     }).Width(16); 
    }) 
    .Editable(editing => editing.Mode(GridEditMode.InLine)) 
    .Pageable() 
    .Scrollable() 
    .Sortable() 
) 

控制器:

[GridAction] 
public ActionResult Accounts() 
{ 
    ViewData["Banks"] = db.Banks.Select(b => new { Id = b.BankId, Name = b.Name }); 
    return View(new GridModel(accountRepository.All())); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
[GridAction] 
public ActionResult InsertAccount() 
{ 
    //Create a new instance of the EditableProduct class. 
    EditableAccount account = new EditableAccount(); 

    //Perform model binding (fill the product properties and validate it). 
    if (TryUpdateModel(account)) 
    { 
     //The model is valid - insert the product. 
     accountRepository.Insert(account); 
    } 

    //Rebind the grid 
    return View(new GridModel(accountRepository.All())); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
[GridAction] 
public ActionResult SaveAccount(int id, int bankId) 
{ 
    EditableAccount account = new EditableAccount 
    { 
     AccountId = id, 
     Bank = db.Banks 
        .Where(b => b.BankId == bankId) 
        .Select(b => b.Name).SingleOrDefault(), 
     BankId = bankId 
    }; 

    TryUpdateModel(account); 

    accountRepository.Update(account); 

    return View(new GridModel(accountRepository.All())); 
} 

[AcceptVerbs(HttpVerbs.Post)] 
[GridAction] 
public ActionResult DeleteAccount(int id) 
{ 
    //Find a customer with ProductID equal to the id action parameter 
    EditableAccount account = accountRepository.One(a => a.AccountId == id); 

    if (account != null) 
    { 
     //Delete the record 
     accountRepository.Delete(account); 
    } 

    //Rebind the grid 
    return View(new GridModel(accountRepository.All())); 
} 

型號:

public class EditableAccount 
{ 
    [ScaffoldColumn(false)] 
    public int AccountId { get; set; } 

    [Required] 
    [UIHint("GridForeignKey")] 
    [DisplayName("Bank")] 
    public int BankId { get; set; } 
    public string Bank { get; set; } 

    [Required] 
    [DisplayName("AccountNumber")] 
    public int AccountNumber { get; set; } 
} 

存儲庫:

public IList<EditableAccount> All() 
{ 
    IList<EditableAccount> result = 
      (from account in db.Accounts 
      select new EditableAccount 
      { 
       AccountId = account.AccountId, 
       Bank = account.Bank.Name, 
       BankId = account.BankId, 
       AccountNumber = account.AccountNr 
      }).ToList(); 

    return result; 
} 

public EditableAccount One(Func<EditableAccount, bool> predicate) 
{ 
    return All().Where(predicate).FirstOrDefault(); 
} 

public void Insert(EditableAccount insertedAccount) 
{ 
    Account account = new Account(); 
    account.BankId = insertedAccount.BankId; 
    account.AccountNr = insertedAccount.AccountNumber; 
    db.Accounts.InsertOnSubmit(account); 
    db.SubmitChanges(); 
} 

public void Update(EditableAccount updatedAccount) 
{ 
    Account account = db.Accounts.SingleOrDefault(a => a.AccountId == updatedAccount.AccountId); 
    account.BankId = updatedAccount.BankId; 
    account.AccountNr = updatedAccount.AccountNumber; 
    db.SubmitChanges(); 
} 

public void Delete(EditableAccount deletedAccount) 
{ 
    Account account = db.Accounts.SingleOrDefault(a => a.AccountId == deletedAccount.AccountId); 
    db.Accounts.DeleteOnSubmit(account); 
    db.SubmitChanges(); 
} 
+0

您是否嘗試過Telerik論壇?我個人從未使用過與你使用的情況相同的情況,但我主要與他們的支持團隊保持着良好的運氣,尤其是他們的團隊成員阿塔納斯(Atanas),他非常善於弄清楚你需要什麼 –

回答