سؤال

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

مثل هذا:

public ActionResult asd(string submitButton){
     switch(submitButton){
         case "Insert":
             return Insert();
         // bla bla bla
     }
}

[NonAction]
public ActionResult Insert(){
    // some code inside here
    return View();
}

مرة أخرى ، لماذا يجب أن أستخدم نوناكتيون بدلا من شيء من هذا القبيل:

public void Insert(){
    // some code inside here
}
هل كانت مفيدة؟

المحلول

يمكنك الاستغناء عن NonAction السمة ولكن بعد ذلك لا تزال الطريقة قابلة للاستدعاء كأسلوب عمل.

من موقع MSDN (المرجع):

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

نصائح أخرى

ومن الجدير بالذكر أن الحاجة إلى استخدام [NonAction] ينطبق فقط على الأساليب العامة.لا يتم التعامل مع الأساليب المحمية والخاصة كإجراءات.منذ الخاص بك Update/Delete/Insert الأساليب هي مساعدين ل asd(), ، ستكون الطريقة الخاصة أكثر ملاءمة للسيناريو الخاص بك:

public ActionResult asd(string submitButton){
    switch(submitButton){
        case "Insert":
            return Insert();
        // bla bla bla
    }
}

ActionResult Insert(){
    // some code inside here
}

إذا كنت لا تستخدم السمة [NonAction] ، فيمكن لشخص ما استدعاء الإجراء مباشرة بدلاً من الاضطرار إلى المرور عبر وظيفة "asd"

قراءة مقالة هاك

أي طريقة عامة في فئة وحدة التحكم قابلة للاستدعاء عبر عنوان URL.

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

public interface IEmployee
{
 void Save(Employee e);
 bool Validate(Employee e);
}

public class EmployeeController:Controller, IEmployee
{
  public void Save(Employee e){
  }

  [NonAction]
  public void Validate(Employee e){
  }
}

لقد استخدمت للتو [NonAction] في واجهة برمجة تطبيقات الويب لدينا ، لتزيين مجموعة من طرق التحكم (نقاط النهاية) لأننا اتخذنا قرارًا في اللحظة الأخيرة بأننا سنؤجل تسليم نقاط النهاية المحددة.

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

لذلك استخدمت هذه السمة ووفرت لي الكثير من الوقت.

سأزيله في الإصدار التالي وسيكون هذا موجودًا!

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

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

لذا ، فإن مجرد الحصول على نوع إرجاع ليس نتيجة ActionResult لن بالضرورة يمنع بالضرورة ظهور هذه الطريقة كإجراء متاح للجميع يمكن استدعاؤه عبرURL.

قد يكون هناك العديد من الأسباب التي تجعلك لا تريد كشف طريقة كإجراء يمكن استدعاؤه عبر عنوان url ، وفي حالة رغبتك في "الحماية" من ذلك ، فعند استخدام [NonAction "].

يشير هذا إلى أن طريقة وحدة التحكم ليست طريقة إجراء. مثال: [NonAction] IndexTest العامة باطلة {// Do some thing} هذه سمة مفيدة جدًا عندما لا يمكن تغيير رؤية أسلوب وحدة التحكم إلى خاص.

إنها سمة تُستخدم في الطرق المحددة بواسطة معدِّلات الوصول العام.في الواقع ، يتعامل MVC Framework مع جميع الطرق العامة كعناوين URL ولكن في حالة عدم رغبتك في ذلك ، يتعين عليك تزيين طريقة بسمة non action.يمكن تحقيق الشيء نفسه بجعل الطريقة خاصة.

فيما يلي مثال على سمة NonAction. http://yogeshdotnet.com/non-action-attribute-in-mvc/

إذا كنت لا تريد استدعاء بعض أساليب العمل، فيجب عليك وضع علامة عليها باستخدام سمة [NonAction] أو بجعلها خاصة

public ActionResult Index(){
    return View();
}

[NonAction]
public ActionResult Countries(List<string>countries){
    return View(countries);
}

يمكنك نسخ الكود ولصقه ورؤية النتيجة. شكرا

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