Отправить значение столбца ForeignKey в сетке кендо на контроллер при встроенном редактировании
Я уже давно борюсь с этим. У меня есть сетка кендо, в которой есть несколько выпадающих списков. Я поместил выпадающий список в сетке, используя столбец внешнего ключа. Сетка при встроенном редактировании не отправляет выбранное значение раскрывающегося списка в контроллер, а отправляет старое значение. Я не совсем уверен, что идет не так, любые выводы будут очень полезны.
Код:
Посмотреть
@(Html.Kendo().Grid(Model.App_Client_Mapping)
.Name("AppAccountInternalGrid")
.Events(ev => ev.Edit("OnGridEdit"))
.Columns(columns =>
{
columns.Bound(p => p.AccountMappingID).Title("AccountMappingID").Width(130).Hidden(true);
columns.ForeignKey(p => p.Level1ID, (System.Collections.IEnumerable)ViewData["level1"], "Level1ID", "Level1").Title("Level 1").Width(150).HtmlAttributes(new { id = "Level1Dropdown", data_value_primitive = true });
columns.ForeignKey(p => p.Level2ID, (System.Collections.IEnumerable)ViewData["level2"], "Level2ID", "Level2").Title("Level 2").Width(150).HtmlAttributes(new { id = "Level2Dropdown" });
columns.Bound(p => p.ExternalAccount).Title("ExternalAccount").Width(150);
})
.Editable(editable => editable.Mode(GridEditMode.InLine))
.DataSource(dataSource => dataSource
.Ajax()
.PageSize(50)
.Model(model =>
{
model.Id(p => p.AccountMappingID);
model.Field(p => p.AccountMappingID).Editable(false);
model.Field(p => p.Level1ID).DefaultValue(1).Editable(true);
model.Field(p => p.Level1).Editable(true);
model.Field(p => p.Level2ID).DefaultValue(0).Editable(true);
model.Field(p => p.Level2).Editable(true);
}
)
.Update("EditingInline_Update", "AppAccounts")
.ServerOperation(false)
)
)
контроллер:
Сетка получает данные из этого действия. Представление имеет другие элементы наряду с сеткой, поэтому я связал модель представления.
public ActionResult AppInternal(int clientid)
{
var result = new AppViewModel();
result.App_Client_Mapping=_unitofwork.AppInternal.Get(clientid);
var level1 = level1list.Select(x => new App_Client_Mapping
{
Level1ID = x.LevelID,
Level1 = x.Level1
}).ToList();
var level2 = level2list.Select(x => new App_Client_Mapping
{
Level2ID = x.Level2ID,
Level2 = x.Level2
}).ToList();
ViewData["level1"] = level1;
ViewData["level2"] = level2;
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult EditingInline_Update([DataSourceRequest] DataSourceRequest request, App_Client_Mapping mapping)
{
//save the mapping in the database tables
return Json(new[] { mapping }.ToDataSourceResult(request, ModelState));
}
ViewModel:
AppViewModel:
public class AppMappingViewModel
{
public IEnumerable<App_Client_Mapping> App_Client_Mapping { get; set; }
//other fields
}
Автоматически сгенерированный класс app_client_mapping из EF:
public class app_client_mapping
{
public int AccountMappingID{get;set;}
public int Level1ID{get;set;}
public string Level1{get;set;}
public int Level2ID{get;set;}
public string Level2{get;set;}
public string ExternalAccount{get;set;}
}
Когда набор данных передается контроллеру. Только обновленное значение внешней локальной суммы (которая является текстовым полем) в сетке отправляется. Обновленные выпадающие значения не отправляются в сетку. Любые идеи относительно того, почему это происходит, будут огромной помощью.
Спасибо!
1 ответ
Вы, кажется, скучаете по .Read
действие для вашей сетки?
Вот как у меня есть выпадающие внутри моей сетки. Я постарался сделать его похожим на ваш код.
контроллер:
public IActionResult AppInternal()
{
ViewData["level1"] = _context.level1list.Select(x => new App_Client_Mapping {
Level1ID = x.LevelID,
Level1 = x.Level1
}); // Do not return a .List()
// put more dropdowns as required...
return View();
}
// return the .Read action from your grid
public IActionResult Read([DataSourceRequest] DataSourceRequest request)
{
var result = new AppViewModel();
result.App_Client_Mapping=_unitofwork.AppInternal.Get(clientid);
return Json(result.ToDataSourceResult(request));
}
// Update
public EditingInline_Update([DataSourceRequest] DataSourceRequest request, App_Client_Mapping mapping)
{
if (ModelState.IsValid)
{
// update db with the Level1ID from your dropdown
}
// Return the updated product. Also return any validation errors.
return Json(new[] { mapping }.ToDataSourceResult(request, ModelState));
}
Посмотреть:
columns.ForeignKey(p => p.Level1ID, (System.Collections.IEnumerable)ViewData["level1"], "Level1ID", "Level1").Title("Level 1").Width(150); // Don't need to put HtmlAttributes.
// The .Read Action should be
.Read(read => read.Action("Read", "AppAccounts")
Внешний ключ EditorTemplate:
@model object
@(Html.Kendo().ComboBoxFor(m => m)
.BindTo((SelectList)ViewData[ViewData.TemplateInfo.GetFullHtmlFieldName("") + "_Data"])
.ValuePrimitive(true)
)
Вот пример кода: демоверсия MVC