Пользовательские правила FxCop для проверки атрибутов в приложении MVC

Есть ли достаточно простой способ заставить FxCop проверить, используются ли ViewBag, ViewData в приложении MVC.


person SCP    schedule 05.06.2013    source источник


Ответы (1)


Самым простым подходом будет проверка экземпляров MemberBinding с именем «ViewBag» или «ViewData» (с префиксами get_ и set_). Это может привести к большому количеству ложных срабатываний, поэтому следующим уровнем сложности/полноты будет проверка типа целевого объекта MemberBinding, чтобы определить, является ли он представлением или контроллером. например.:

private readonly string[] _forbiddenNames = new string[] { "get_ViewBag", "set_ViewBag", "get_ViewData", "set_ViewData" };

public override ProblemCollection Check(Member member)
{
    var method = member as Method;
    if (method != null)
    {
        this.Visit(method.Body);
    }

    return this.Problems;
}

public override void VisitMemberBinding(MemberBinding memberBinding)
{
    base.VisitMemberBinding(memberBinding);

    var memberName = memberBinding.BoundMember.Name.Name;
    if (this._forbiddenNames.Contains(memberName))
    {
        this.Problems.Add(new Problem(this.GetResolution(memberBinding.BoundMember), memberBinding, memberName));
    }
}
person Nicole Calinoiu    schedule 05.06.2013
comment
Привет, Николь. Код, объявленный в HomeController, public ActionResult Index() { ViewBag.Message = Добро пожаловать в ASP.NET MVC!; this.ViewData[temp] = Добро пожаловать; вернуть вид(); } Я попытался переопределить VisitMethodCall, чтобы получить доступ к экземпляру MemberBinding.. но заметил, что вызов Visitmethod не вызывается. Как просмотреть экземпляр MemberBinding и проверить ViewData. Есть ли какой-либо метод для анализа экземпляров MemberBinding - person SCP; 06.06.2013
comment
Переопределения Visit___ не будут вызываться, если вы не инициируете посещение в переопределении Check. Я добавил пример в свой ответ. - person Nicole Calinoiu; 08.06.2013