Как получить доступ к модели и метаданным в пользовательском атрибуте ActionFilterAttribute? - PullRequest
1 голос
/ 03 октября 2011
public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // get model
        // get metadata for each model property
        // set viewdata if metadata X exists
    }
}

Старый вопрос был: Как получить доступ к ViewData в пользовательском ModelMetadataProvider? Это был не ход.

1 Ответ

9 голосов
/ 03 октября 2011

Вы не можете / не должны получать доступ к ViewData или любой другой информации, связанной с HttpContext, в поставщике метаданных модели.


ОБНОВЛЕНИЕ:

После того, как обновленный вопрос начинает иметь смысл, давайте обновим ответ:

public class CheckMetadataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {

        // get model?
        var result = filterContext.Result as ViewResultBase;
        if (result != null)
        {
            var model = result.Model;
            if (model != null)
            {
                // get metadata for model (you have a single model, no idea what you meant by "for each model" in your question)
                var metadata = ModelMetadataProviders.Current.GetMetadataForType(null, model.GetType());
                if (metadata.DisplayName == "foo bar")
                {
                    // set viewdata if metadata X exists
                    filterContext.Controller.ViewData["foo"] = "bar";
                }
            }
        }
    }
}    

Очевидно, что использование ViewData в приложении ASP.NET MVC - это то, против чего я абсолютно рекомендую. ViewData слабо набрано. Чего бы вы ни пытались достичь (было бы неплохо, если бы вы объяснили, в чем ваша цель), не используйте ViewData, используйте модели представлений и строго типизированные представления.

Лично у меня аллергия на такие вещи, как ViewBag / ViewData в приложениях ASP.NET MVC. Когда я проверяю код и вижу людей, использующих их, я знаю, что они сделали что-то не так.

...