Hi all,
I am trying to create an Ajax Telerik grid in Razor that has an updateable foreign key column that shows a dropdown list. I've copied my page pretty much like the example, and everything works. I can add new records, delete them and edit them. The only thing that doesn't work is that I get a textfield with the integer when I update a record in my grid, instead of a dropdown list with all the possibilities of the foreign key table.
Anyone have any ideas on how I could fix this? See code below.
Telerik grid:
Controller:
Model:
Repository:
I am trying to create an Ajax Telerik grid in Razor that has an updateable foreign key column that shows a dropdown list. I've copied my page pretty much like the example, and everything works. I can add new records, delete them and edit them. The only thing that doesn't work is that I get a textfield with the integer when I update a record in my grid, instead of a dropdown list with all the possibilities of the foreign key table.
Anyone have any ideas on how I could fix this? See code below.
Telerik grid:
@(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())Controller:
[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()));}Model:
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; }}Repository:
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;}/// <summary>/// Ones the specified predicate./// </summary>/// <param name="predicate">The predicate.</param>/// <returns></returns>public EditableAccount One(Func<EditableAccount, bool> predicate){ return All().Where(predicate).FirstOrDefault();}/// <summary>/// Inserts the specified account./// </summary>/// <param name="account">The account.</param>public void Insert(EditableAccount insertedAccount){ Account account = new Account(); account.BankId = insertedAccount.BankId; account.AccountNr = insertedAccount.AccountNumber; db.Accounts.InsertOnSubmit(account); db.SubmitChanges();}/// <summary>/// Updates the specified account./// </summary>/// <param name="account">The account.</param>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();}/// <summary>/// Deletes the specified account./// </summary>/// <param name="account">The account.</param>public void Delete(EditableAccount deletedAccount){ Account account = db.Accounts.SingleOrDefault(a => a.AccountId == deletedAccount.AccountId); db.Accounts.DeleteOnSubmit(account); db.SubmitChanges();}