Я изучаю способы реализации пользовательского элемента checkbox, который я могу использовать в своих представлениях Razor. Приложение использует Microsoft.AspNetCore 2.0.0
. U попробовал как собственное решение TagHelper
и статический метод расширения для IHtmlHelper
.
К сожалению, первоначально проект MVC5 загружал старые статические помощники MVC5, которым требуется портирование.
Вызов проблемного метода arg [2] здесь:
ModelExplorer metadata = ExpressionMetadataProvider.FromLambdaExpression(expression, (ViewDataDictionary<TModel>)html.ViewData, [I need to resolve and pass in IModelMetadataProvider here]);
Вот базовый код для помощника
public static IHtmlContent MvcCheckBoxFor<TModel, TResult>(this IHtmlHelper<TModel> html, Expression<Func<TModel, TResult>> expression, object htmlAttributes = null)
{
// see http://aspnetwebstack.codeplex.com/SourceControl/changeset/view/5cb74eb3b2f3#src/System.Web.Mvc/Html/InputExtensions.cs this applies the correct "name" HTMl attribute
if (expression == null)
{
throw new ArgumentNullException("expression");
}
// TODO: Resolve IModelMetedataProvider - argument 3 - left null
ModelExplorer metadata = ExpressionMetadataProvider.FromLambdaExpression(expression, (ViewDataDictionary<TModel>)html.ViewData, null);
bool isChecked = false;
if (metadata.Model != null)
{
bool modelChecked;
if (Boolean.TryParse(metadata.Model.ToString(), out modelChecked))
{
isChecked = modelChecked;
}
}
string fullName = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldName(ExpressionHelper.GetExpressionText(expression));
return CheckBoxHelper(fullName, fullName, isChecked, htmlAttributes);
}
Я опустил код CheckBoxHelper
поскольку функциональность выходит за рамки проблемы. Хотя подпись ниже:
private static IHtmlContent CheckBoxHelper(string name, string id, bool isChecked, object htmlAttributes)
Старый способ достижения вызова.NET 4.5.2 был:
ModelMetadata.FromLambdaExpression(expression, html.ViewData);
Подпись и пространство имен были изменены с System.Web.Mvc
на Microsoft.AspNetCore.Mvc.ViewFeatures.Internal
Просто интересно, какую стратегию я могу использовать для этого вызова. Помощники MSFT, такие как @Html.LabelFor
должны что-то делать под капотом - они также находятся в статическом контексте.
Activator.CreateInstance<IModelMetadataProvider>()
доступен, но не является жизнеспособным, так как вы не можете создать экземпляр интерфейса. Есть ли конкретный тип или обходной путь?
Любая помощь могла бы быть полезна.
Большое спасибо за то, что нашли время, чтобы прочитать это,
Джон
Просто просмотрел код IHtmlHelper
- есть поле только для чтения IModelMetadataProvider.
Так,
html.MetadataProvider
Решает его. Я чувствую себя настолько глупо. Большое спасибо MSFT за его включение!