https://www.dntips.ir/jquery https://www.dntips.ir/mvc https://www.dntips.ir/برنامه
الف) ساختار کنترلر جستجوی سایت
فرض کنید جستجوی سایت در کنترلری به نام Search و توسط اکشن متد پیش فرضی با فرمت زیر مدیریت میشود:
[ValidateInput(false)] //برنامه نویسها نیاز دارند تگها را جستجو کنند public virtual ActionResult Index(string term) {
ب) مدیریت کنترلرهای یافت نشد
اگر از یک IoC Container در برنامهی ASP.NET MVC خود مانند StructureMap استفاده میکنید، نوشتن کد متداول زیر کافی نیست:
public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { return ObjectFactory.GetInstance(controllerType) as Controller; } }
public class StructureMapControllerFactory : DefaultControllerFactory { protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) { if (controllerType == null) { var url = requestContext.HttpContext.Request.RawUrl; //string.Format("Page not found: {0}", url).LogException(); requestContext.RouteData.Values["controller"] = MVC.Search.Name; requestContext.RouteData.Values["action"] = MVC.Search.ActionNames.Index; requestContext.RouteData.Values["term"] = url.GetPostSlug().Replace("-", " "); return ObjectFactory.GetInstance(typeof(SearchController)) as Controller; } return ObjectFactory.GetInstance(controllerType) as Controller; } }
ج) مدیریت آدرسهای یافت نشد پسوند دار
تنظیمات فوق کلیه آدرسهای بدون پسوند را مدیریت میکند. اما اگر درخواست رسیده به شکل https://www.dntips.ir/mvc/test/file.aspx بود، خیر. در اینجا حداقل سه مرحله را باید جهت مدیریت و هدایت خودکار آن به صفحهی جستجو انجام داد
- باید فایلهای پسوند دار را وارد سیستم مسیریابی کرد:
routes.RouteExistingFiles = true; //نیاز هست دانلود عمومی فایلها تحت کنترل قرار گیرد
پس از مسیریابی پیش فرض سایت (نه قبل از آن)، مسیریابی ذیل باید اضافه شود:
routes.MapRoute( "CatchAllRoute", // Route name "{*url}", // URL with parameters new { controller = "Search", action = "Index", term = UrlParameter.Optional, area = "" }, // Parameter defaults new { term = new UrlConstraint() } );
مشکل! نیاز است پارامتر term را به صورت پویا مقدار دهی کنیم. برای اینکار میتوان یک RouteConstraint سفارشی نوشت:
public class UrlConstraint : IRouteConstraint { public bool Match(System.Web.HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) { var url = httpContext.Request.RawUrl; //string.Format("Page not found: {0}", url).LogException(); values["term"] = url.GetPostSlug().Replace("-", " "); return true; } }