Я создаю помощник, который позволит мне создавать каскадные выпадающие списки, которые заполняют себя с помощью AJAX. Вспомогательный метод выглядит следующим образом:Не удается получить управляющее имя из выражения с помощью ExpressionHelper
public static MvcHtmlString AjaxSelectFor<TModel, TProperty>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TProperty>> expression,
Expression<Func<TModel, TProperty>> cascadeFrom,
string sourceUrl,
bool withEmpty = false)
{
string controlFullName = html.GetControlName(expression);
string cascadeFromFullName = html.GetControlName(cascadeFrom);
var selectBuilder = GetBaseSelect(controlFullName.GetControlId(), controlFullName, sourceUrl, withEmpty);
selectBuilder.Attributes.Add("data-selected-id", html.GetValue(expression));
selectBuilder.Attributes.Add("data-cascade-from", "#" + cascadeFromFullName.GetControlId());
return new MvcHtmlString(selectBuilder.ToString());
}
private static TagBuilder GetBaseSelect(string controlId, string controlName, string sourceUrl, bool withEmpty)
{
var selectBuilder = new TagBuilder("select");
selectBuilder.Attributes.Add("id", controlId);
selectBuilder.Attributes.Add("name", controlName);
selectBuilder.Attributes.Add("data-toggle", "ajaxSelect");
selectBuilder.Attributes.Add("data-source-url", sourceUrl);
selectBuilder.Attributes.Add("data-with-empty", withEmpty.ToString());
selectBuilder.AddCssClass("form-control");
return selectBuilder;
}
internal static string GetControlName<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> expression)
{
string controlName = ExpressionHelper.GetExpressionText(expression);
return html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(controlName);
}
internal static string GetControlId(this string controlName)
{
return TagBuilder.CreateSanitizedId(controlName);
}
первое выражение цели свойство, которое будет связано в контроле и у меня нет проблем получать идентификатор и имя атрибуты для него. Второе задает свойство, из которого будет выполняться хелпер, но когда я получаю метод GetControlName, выражение ExpressionHelper.GetExpressionText (выражение) возвращает пустую строку вместо имени свойства. Я добавил часы на «выражение», чтобы проверить, что происходит не так, и его значение следующим образом:
{model => Convert(model.TopCategoryId)}
В то время как я получаю следующее значение, когда я получаю имя свойства для первого выражения:
{model => model.CategoryId}
Я действительно не понимаю, почему существует разница между этими двумя выражениями. Вот как я называю помощника на мой взгляд, в случае, если это отношение так или иначе:
@Html.AjaxSelectFor(model => model.CategoryId, model => model.TopCategoryId, "/api/Categories/GetSelectList", true)
Любая идея, что здесь происходит?
Вы понимаете, что это никогда не даст вам исправить 2 способ модель связывания, и никакой проверки на стороне клиента , –
Нет, я этого не сделал. На самом деле у меня нет большого опыта создания собственных помощников по созданию баз данных. Есть ли у вас какая-то полезная документация по этому вопросу? – ZipionLive
Во-первых, проблема заключается в том, что 'TProperty' в' expression' совпадает с 'TProperty' в сигнатуре метода (OK), но' TProperty' в 'cascadeFrom' не так, что он не может быть разрешен. –