لماذا لا يعمل أي من الإجراءات الخاصة بي؟
-
06-09-2019 - |
سؤال
أنا طلب سؤال في وقت سابق اليوم حول 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()%>
بيان أو شيء مماثل؟