#c# #jquery #asp.net-mvc #kendo-ui #kendo-grid
#c# #jquery #asp.net-mvc #kendo-ui #kendo-grid
Вопрос:
Я использую сетку Kendo с редактором всплывающих окон для отображения строк из базы данных. Строки взяты из таблицы «FemaleAdvice». Каждый объект FemaleAdvice будет принадлежать FemaleCategory в том смысле, что FemaleCategory является таблицей поиска, и когда пользователь выбирает FemaleCategory, будет показан список названий и описаний объектов FemaleAdvice.
Позволяя пользователю редактировать, к какой категории FemaleCategory относится объект FemaleAdvice, имело бы смысл отображать заголовок категории вместо ключа базы данных. Я предпринял пару шагов, чтобы сделать это, но прямо сейчас я получаю ошибку «Uncaught: ReferenceError: категория не определена» в консоли, когда я нажимаю «Добавить новую запись». Я чувствую, что это что-то простое, но я новичок в MVC / Kendo, поэтому мое невежество проявляется. Мой код приведен ниже:
//FemaleAdvice Model
[Key]
[ScaffoldColumn(false)]
public Int64 FemaleAdviceKey { get; set; }
public string Title { get; set; }
public string Description { get; set; }
[Required]
[UIHint("FemaleCategoryKey")]
[DisplayName("Female Category")]
public Int64 FemaleCategoryKey { get; set; }
public virtual FemaleCategory Category { get; set; }
[UIHint("Body")]
public string Body { get; set; }
[ScaffoldColumn(false)]
public DateTime LastUpdated { get; set; }
//*************FemaleAdvice View**************
@(Html.Kendo().Grid<com.RomanceCoachOnTheGo.MVC.Models.FemaleAdvice>()
.Name("FemaleAdvice")
.ToolBar(toolbar =>
{
toolbar.Create();
})
.DataSource(dataSource => dataSource
.Ajax()
.Model(item => { item.Id(m => m.FemaleAdviceKey); })
.Create(c => c.Action("CreateFemaleAdvice", "Administrator"))
.Read(r => r.Action("ReadFemaleAdvice", "Administrator"))
.Update(u => u.Action("UpdateFemaleAdvice", "Administrator"))
.Destroy(d => d.Action("DeleteFemaleAdvice", "Administrator"))
)
.Columns(col =>
{
col.Bound(c => c.FemaleCategoryKey).ClientTemplate("#=Category.Title#");
col.Bound(c => c.Title);
col.Bound(c => c.Description);
col.Bound(c => c.Body);
col.Command(command => { command.Edit(); command.Destroy(); });
})
.Editable(editing => editing.Mode(GridEditMode.PopUp))
.Sortable()
.Pageable()
.Filterable()
)
//***********Relevant Controller Action***************
public ActionResult ReadFemaleAdvice([DataSourceRequest] DataSourceRequest request)
{
List<FemaleAdvice> advice = _db.FemaleAdvice.Include("Category").AllActive().ToList();
return Json(advice.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
}
public ActionResult CreateFemaleAdvice([DataSourceRequest] DataSourceRequest request, FemaleAdvice advice)
{
if (ModelState.IsValid)
{
advice.IsActive = true;
_db.FemaleAdvice.Add(advice);
_db.SaveChanges();
}
return Json(new[] { advice }.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
}
Комментарии:
1. Вы получаете ту же ошибку при редактировании существующей записи или это происходит только при добавлении новой записи?
2. Только когда я добавляю новую запись. Редактирование работает нормально.
3. Однако я только что понял, что редактирование создает дублирующуюся строку в таблице FemaleCategory.
4. Это начало происходить только тогда, когда я добавил «.ClientTemplate(«#= Категория. Заголовок #»);» в область столбцов сетки и «. Включить («Категория»)» в действие контроллера, чтобы заставить FemaleCatetoryKey отображаться в качестве заголовка вместо ключа.
Ответ №1:
Проблема возникает из-за того, что при добавлении записи ваше Category
значение равно null. Итак, Kendo не знает, как отобразить шаблон, который вы дали здесь:
col.Bound(c => c.FemaleCategoryKey).ClientTemplate("#=Category.Title#");
К сожалению, синтаксис шаблона Kendo плохо справляется с обработкой нулей, поэтому вам нужно проверить это самостоятельно. Измените шаблон на что-то вроде этого:
#= Category != null ? Category.Title : '' #
Это будет распечатано Category.Title
, если оно установлено, в противном случае это будет пустая строка, пока она не будет установлена.
Комментарии:
1. Спасибо, я начну изучать это!