asp.net - أسب مفك التوجيه مع> 1 معلمة




asp.net-mvc url-rewriting (2)

لقد تم تحديد المسار التالي

            routes.MapRoute(
            "ItemName",
            "{controller}/{action}/{projectName}/{name}",
            new { controller = "Home", action = "Index", name = "", projectName = "" }
            );

هذا الطريق يعمل فعلا، لذلك إذا كنت اكتب في المتصفح

/Milestone/Edit/Co-Driver/Feature complete

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

ومع ذلك، إذا حاولت وبناء الرابط في الرأي مع url.action -

<%=Url.Action("Edit", "Milestone", new {name=m.name, projectName=m.Project.title})%>

أحصل على عنوان ورل التالي

Milestone/Edit?name=Feature complete&projectName=Co-Driver

انها لا تزال تعمل، ولكنها ليست نظيفة جدا. أيه أفكار؟


عند بناء ومطابقة الطرق في التوجيه ASP.NET (وهو ما يستخدم ASP.NET مفك)، يتم استخدام المباراة المناسبة الأولى، وليس غريديست، والنظام أمر مهم.

لذلك إذا كان لديك طريقان:

"{controller}/{action}/{id}"
"{controller}/{action}/{projectName}/{name}"

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

في الواقع، نظرا لأنك قدمت القيم الافتراضية ل {بروجكتنام} و {نيم}، فإنها تتعارض تماما مع المسار الافتراضي. إليك اختياراتك:

  • قم بإزالة المسار الافتراضي. القيام بذلك إذا كنت لا تحتاج إلى المسار الافتراضي أي أكثر من ذلك.

  • حرك المسار الأطول أولا، وجعله أكثر وضوحا بحيث لا يتطابق مع المسار الافتراضي، مثل:

    routes.MapRoute(
        "ItemName",
        "Home/{action}/{projectName}/{name}",
        new { controller = "Home", action = "Index", name = "", projectName = "" }
    );

    وبهذه الطريقة، فإن أي مسارات مع وحدة تحكم == الرئيسية تتطابق مع الطريق الأول، وأي طرق مع وحدة تحكم! = المنزل سوف تتطابق مع الطريق الثاني.

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


يمكنك المحاولة

Html.RouteLink("Edit","ItemName", new {name=m.name, projectName=m.Project.title});




url-rewriting