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