ASP.NET MVC المعاينة 4 - وقف Url.RouteUrl() إلخ.باستخدام القائمة المعلمات

StackOverflow https://stackoverflow.com/questions/49194

  •  09-06-2019
  •  | 
  •  

سؤال

لدي عمل مثل هذا:

public class News : System.Web.Mvc.Controller
{
    public ActionResult Archive(int year)
    {
       / *** /
    }
}

مع مسار مثل هذا:

routes.MapRoute(
           "News-Archive",                                              
           "News.mvc/Archive/{year}",                           
           new { controller = "News", action = "Archive" }
       );

عنوان URL الذي أنا عليه هو:

News.mvc/Archive/2008

لدي النموذج على هذه الصفحة مثل هذه:

<form>
    <select name="year">
        <option value="2007">2007</option>
    </select>
</form>

تقديم النموذج يجب أن تذهب إلى الأخبار.mvc/الأرشيف/2007 إن '2007' المحددة في النموذج.

وهذا يتطلب تشكيل "حركة" السمة "الخبر.mvc/الأرشيف".

ومع ذلك ، إذا أعلن شكل مثل هذا:

<form method="get" action="<%=Url.RouteUrl("News-Archive")%>">

يجعل مثل:

<form method="get" action="/News.mvc/Archive/2008">

يمكن للشخص يرجى اسمحوا لي أن أعرف ما أنا في عداد المفقودين ؟

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

المحلول

لديك عدة مشاكل ، على ما أعتقد.

أولا المسار الخاص بك لا تحتوي على قيمة افتراضية على "السنة" ، لذلك URL "/الأخبار.mvc/الأرشيف" هو في الواقع غير صالحة لأغراض التوجيه.

ثانيا انت تتوقع شكل قيم تظهر كما معلمات المسار ، ولكن هذا ليس كيف HTML يعمل.إذا كنت تستخدم عادي شكل مع تحديد و تقديم عناوين المواقع الخاصة بك سوف ينتهي بعد "?السنة=2007" في نهاية لهم.هذا هو فقط كيف تحصل على-طريقة أشكال تم تصميمها للعمل في HTML.

لذلك تحتاج إلى التوصل إلى بعض الاستنتاجات حول ما هو مهم.

  • إذا كنت تريد المستخدم أن يكون قادرا على تحديد شيء من القائمة المنسدلة و التي تغييرات تقديم عنوان URL ، ثم عليك استخدام جافا سكريبت لتحقيق هذا (عن طريق اعتراض شكل تقديم وصياغة URL الصحيح).
  • إذا كنت بخير مع /الأخبار.mvc/الأرشيف ؟ السنة=2007 URL الخاص بك, ثم يجب عليك إزالة {السنة} التسمية من الطريق تماما.لا يزال يمكنك ترك "الباحث العام" المعلمة على العمل الخاص بك ، منذ تشكيل القيم أيضا ملء طريقة عمل المعلمات.

نصائح أخرى

أعتقد أنني قد عملت لماذا - الطريق يشمل {السنة} حتى ولدت الطرق دائما أيضا..

إذا كان أي شخص يمكن تأكيد هذا ؟

الحل

حسنا هنا هو الحل ، (بفضل براد الرائدة لي هناك).

1) يتطلب القيمة الافتراضية في الطريق:

routes.MapRoute(
       "News-Archive",                                              
       "News.mvc/Archive/{year}",                           
       new { controller = "News", action = "Archive", year = 0 }
   );

2) إضافة توجيه إلى تحليل الحصول على المعلمات كما لو أنهم URL شرائح.

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
}

3) تأكد من أن لديك الخاص بك إعادة توجيه رمز طلب params قبل أي رمز إعادة توجيه "الافتراضي" في العام الإدخالات.أي

public ActionResult Archive(int year)
{
   if (!String.IsNullOrEmpty(Request["year"]))
   {
       return RedirectToAction("Archive", new { year = Request["year"] });
   }
   if (year == 0)
   {
       /* ... */
   }
   /* ... */
}

3) صراحة تحديد القيمة الافتراضية العام في Url.RouteUrl() الدعوة:

Url.RouteUrl("News-Archive", new { year = 0 })
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top