سؤال

لماذا ما يلي Html.ActionLink يتصل:

Html.ActionLink("Approve", "Advance", new { id = Model.ID, step = StepType.Approve })

قم بإنشاء عنوان URL مع معلمات الاستعلام بدلا من عنوان URL "مريح"، أي:

http://localhost/Website/Case/Advance/1?step=Refer

ليس لدي سوى المسار الافتراضي المسجل، هل أحتاج إلى طرق إضافية يمكن أن تفهم ما هي المعلمة "Steptype"؟

لقد حاولت إضافة هذا الطريق في بعد المسار الافتراضي:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new {controller = "Case", action = "Advance", id = "", step = StepType.Refer});

ولكن ليس لها أي تأثير. إضافة تسجيل الطريق الجديد قبل أعطاني الافتراضي خطأ:

يحتوي القاموس المعلمات على إدخال فارغ لمعرفة "معرف" المعلمة "System.int64" غير القابلة للانفتاح "System.Web.MVCractionResult Advance (Int64، Website.Core.Steptype)" في "موقع الويب .Controllers.caseController ". لإجراء معلمة اختيارية يجب أن يكون نوعه إما نوع مرجعي أو نوع غير قابل للانفصال.

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

المحلول

طريق مخصص يصطاد الكثير في الوقت الحالي

يخبرك استثناءك فقط أن طريقك المخصص يمنح شيئا لا تعتزمه بالقبض عليه. لذلك إذا كان هناك طلب إلى عنوان URL لجذر التطبيق الخاص بك:

http: // localhost / موقع

طريقك المخصص من شأنه أن يمسك به. وتعيين انها الإعدادات الافتراضية. واتصل بك CaseController.Advance() عمل. وبالطبع رمي استثناء، ل id غير محدد.

الحفاظ على طريقك المخصص أمام واحد الافتراضي

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

ولكن أي تغيير يجب أن تفعله؟ إذا كان هناك وحدة تحكم واحدة فقط تحتاجها من تغييرها إلى:

routes.MapRoute(
    "CaseAdvance",
    "Case/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer});

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

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { controller = "Case|Other" });

إذا كان هناك أي وحدة تحكم، فيمكنك إجراء شرط لمعرفك أن تكون رقمي:

routes.MapRoute(
    "CaseAdvance",
    "{controller}/{action}/{id}/{step}",
    new { controller = "Case", action = "Advance", id = "", step = StepType.Refer},
    new { id = @"\d+" })

في هذه الحالة، سيقوم هذا المسار بالقبض على هذه الطلبات فقط التي تحتوي على معرف محدد. كعدد من الدورة.

سوف تعرف أي واحد يناسبك بشكل أفضل.

نصائح أخرى

نعم، إذا لم يكن هناك طريق مثل "{Controller} / {}} / {id} / {step}"، فستنقل طريقة ActionSlink "الخطوة" كمعلمة QueryString.

في طريقك، حددت معلمة من StepType ولكن تمرير معلمة تسمى الخطوة.

يجب أن تطابق أسماء معلمات ActionLink الخاصة بك أسماء معلمات المسار أو ستحصل بالضبط على رؤيتك.

تحرير: حسنا، قمت بتغيير التعليمات البرمجية الخاصة بك أثناء كتابة هذه الإجابة !!

جرب استخدام Routelink. ومعرفة ما إذا كان هذا يعمل من أجلك.

Html.RouteLink("Approve", "CaseAdvance", new { controller = "Case", action = "Advance", id = Model.ID, step = StepType.Approve })

إذا تنتج استدعاء RoiceLink رابط صالح، فسيظل على الأقل أن طريقك هو الإعداد بشكل صحيح.

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