سؤال

أنا طلب سؤال في وقت سابق اليوم حول ActionFilters في ASP.NET MVC. اتضح أن مشكلتي كانت حقا أن بلدي ActionFilter ليس حتى قيد التشغيل. من بين أشياء أخرى قرأت هذه المقالة, ، ولا يمكنني العثور على أي شيء يفعل ذلك أنا لا.

هذا هو رمزي:

// The ActionFilter itself
public class TestingIfItWorksAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        filterContext.Controller.TempData["filter"] = "it worked!";
        base.OnActionExecuting(filterContext);
    }
}

// The Controller Action with the filter applied
[TestingIfItWorks]
public ActionResult Test()
{
    var didit = TempData["filter"];
    return View();
}

نقطة توقف في طريقة المرشح لا تضرب أبدا عندما تصحيح، و TempData["filter"] حاصل على null قيمة عند تقديم العرض.

لماذا هذا لا يعمل؟

هل كانت مفيدة؟

المحلول

بناء على تعليقاتك إلى إجابة أخرى

عند الاختبار عبر اختبارات الوحدات، لا يتم استدعاء المرشح. إذا كنت ترغب في استدعاء المرشح، فستحتاج إلى تقليد تحكم الجهاز. ربما يكون ذلك أفضل، لاختبار المرشح نفسه بمعزل، ثم استخدم التفكير للتأكد من تطبيق المرشح على الإجراء الخاص بك مع السمات الصحيحة. أفضل هذه الآلية حول اختبار المرشح والعمل في تركيبة.

إبداعي

بالتأكيد تحتاج override على طريقتك على خلاف ذلك، لن تستبدل الطريقة الموجودة في الفئة الأساسية. كنت أتوقع أن يشكو المحول البرمجي من أنك بحاجة إما new أو override عليه. إذا كنت لا تشمل override الكلمة الأساسية، سوف تتصرف كما لو كنت تستخدم new. وبعد نظرا لأن الإطار يستدعيها كعملية actionFilterattribute، فهذا يعني أن طريقتك لن تسمى أبدا.

نقلا عن ذلك MSDN.:

إذا لم تسبق الأسلوب الموجود في الفئة المشتقة كلمات رئيسية جديدة أو تجاوزها، فسيقوم المحول البرمجي بإصدار تحذير وسوف تتصرف الطريقة كما لو كانت الكلمة الأساسية الجديدة موجودة.

نصائح أخرى

في حالة أنه مفيد لأي شخص باستخدام MVC 4/5:

لا تعمل ActionFilters إذا حصلت على مساحة الاسم الخاصة بك ActionFilterAttribute أو IActionFilter خاطئ - ظلم - يظلم: https://stackoverflow.com/a/13710468/188926.

يستخدم System.Web.Http.Filters ل API ويب، System.Web.Mvc لإجراءات MVC القياسية.

كما هو الحال في السؤال، سيتم تجاهل سمة المرشح ببساطة (بدون خطأ) إذا كنت تخطئ، مما يجعل من الصعب تشخيصه.

بالإضافة إلى ما قاله Tvanofosson، فإن طريقة العمل الخاصة بك لا تقدم فعلا أي شيء للعرض. هل وجهة نظرك لها <%=TempData["Filter"].ToString()%> بيان أو شيء مماثل؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top