C # Доступ к IModelMetaDataProvider в статическом контексте - IHtmlHelper

2

Я изучаю способы реализации пользовательского элемента 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>() доступен, но не является жизнеспособным, так как вы не можете создать экземпляр интерфейса. Есть ли конкретный тип или обходной путь?

Любая помощь могла бы быть полезна.

Большое спасибо за то, что нашли время, чтобы прочитать это,

Джон

Теги:
asp.net-core

1 ответ

1

Просто просмотрел код IHtmlHelper - есть поле только для чтения IModelMetadataProvider.

Так,

html.MetadataProvider

Решает его. Я чувствую себя настолько глупо. Большое спасибо MSFT за его включение!

  • 0
    Не чувствую себя слишком глупо, я не могу найти пример для этого нигде.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню