ASP.NET MVC المعاينة 4 - وقف Url.RouteUrl() إلخ.باستخدام القائمة المعلمات
-
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 })