2012-05-31 36 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),他非常善于弄清楚你需要什么 –

回答