这个问题通常会出现在使用Kendo UI控件时使用了BeginCollectionItem核心的ASP.NET Core应用程序中。BeginCollectionItem核心会为表单元素生成带有唯一名称和ID的字段,但Kendo控件需要字段具有常规的名称和ID。为了解决这个问题,可以使用一个自定义的HTML助手方法来生成常规名称和ID的字段。以下是一个代码示例:
using Microsoft.AspNetCore.Html;
using Microsoft.AspNetCore.Mvc.ViewFeatures;
using Microsoft.AspNetCore.Mvc.Rendering;
public static class KendoHtmlHelperExtensions
{
public static IHtmlContent KendoTextBoxFor(this IHtmlHelper htmlHelper, Expression> expression, object htmlAttributes = null)
{
var metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData);
var propertyName = metadata.PropertyName;
var value = metadata.Model ?? "";
var name = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(propertyName);
var id = htmlHelper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(propertyName);
var tagBuilder = new TagBuilder("input");
tagBuilder.MergeAttribute("type", "text");
tagBuilder.MergeAttribute("name", name);
tagBuilder.MergeAttribute("id", id);
tagBuilder.MergeAttribute("value", value.ToString());
if (htmlAttributes != null)
{
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
tagBuilder.MergeAttributes(attributes);
}
return tagBuilder.RenderSelfClosingTag();
}
}
然后在视图中使用自定义助手方法而不是使用BeginCollectionItem核心来生成表单字段。例如:
@for (var i = 0; i < Model.Items.Count; i++)
{
@Html.KendoTextBoxFor(x => Model.Items[i].Name)
@Html.KendoNumericTextBoxFor(x => Model.Items[i].Quantity, new { min = 0 })
}
使用自定义助手