سؤال

وأنا أحاول أن إنشاء موقع بسيط. في الأساس لديها واحدة تحكم Home المراقب المالي.

وهذا وحدة تحكم لديه Index العمل يأخذ string كما الحجة (وهو الدليل) ويستخدم هذا 'الدليل' للقيام بعملها.

وأنا لا يمكن العمل على كيفية إنشاء الصيد عامة عن الطريق الذي سوف ترسل كل URL لهذا العمل واحد.

وأي مزيج URL يمكن أن توجد، وأي شيء يتجاوز اسم المجال يجب أن تكون السلسلة.

وhttp://<domain>/2008
http://<domain>/2008/09
http://<domain>/2008/09/Fred

لا أحد يعرف كيفية القيام بذلك؟ ومن شأنه أيضا أن تكون على ما يرام إذا تم تمرير كافة القيم في شكل قائمة.

هل هناك طريقة أفضل للقيام بذلك؟

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

المحلول

وجرب هذا:

routes.MapRoute(
        "Default", "{*path}",
        new { controller = "Home", action = "Index" } 
    );

وحدة تحكم:

public class HomeController : Controller {
    public ActionResult Index(string path) {
        return View();
    }
}

نصائح أخرى

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

وبدا الامر وكأننا كنت تحاول خلط التفاح والبرتقال. ASP.NET MVC لا هادف بعيدا مع 'الصفحة' الفكرة. هناك حقا أي سبب لوجود الدلائل لمختلف المستخدمين إلا إذا كنت تفعل نوعا من الملف I / O، وإذا كان هذا هو الحال بعد ذلك يمكن أن تستخرج للعمل في نموذج ASP.NET MVC بسهولة أكبر بكثير مما قد يتصور البعض.

في ASP.NET MVC إذا أردت أن تختلف المعلومات التي تبحث عنها على أساس السلسلة التي تم تمريرها (مثل الكثير من السلسلة التي مرت)، وهنا طريقة "آمنة" للقيام بذلك:

طريقة # 1 - ثلاثة طرق، ثلاثة تطبيقات، أسماء مختلفة

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "ShowByYear" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "ShowByYearAndMonth" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "ShowByYearMonthAndName" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

وبعد ذلك كنت تستخدم قيم الطريق الذي صدر في تطبيقات التحكم الخاصة بك لتحديد كيف ينظرون إلى البيانات:

ShowByYear(string year)
{
    //Return appropriate View here
}

ShowByYearAndMonth(string year, string month)
{ 
    //Return appropriate View here
}

ShowByYearMonthAndName(string year, string month, string name)
{ 
    //Return appropriate View here
}

الطريقة # 2 - اقترح طريقة

routes.MapRoute(
  "YearOnly",
  "{year}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}" }
);

routes.MapRoute(
  "YearAndMonth",
  "{year}/{month}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}" }
);

routes.MapRoute(
  "YearMonthAndName",
  "{year}/{month}/{name}",
  new { controller = "Index", action = "Show" },
  new { year = @"\d{4}", month = @"\d{2}", name = "" }
);

Show(string year)
{
    //
}

Show(string year, string month)
{
    //Return appropriate View here
}

Show(string year, string month, string name)
{
    //Return appropriate View here
}

وجمال هذا النهج هو أن MapRoute يعالج تحليل URL. ويبقى حثالة-راف بها. يمكنك ثم إعداد التقاط كل الطريق الذي يلقي مجرد خطأ. كنت تفضل لديك بعض الاعراب القيام به على جانب الطريق مع regex مما كانت عليه في جهاز تحكم (في رأيي).

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

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