URLهای Dynamic و Friendly با استفاده از MVC

Dynamic URL یکی از ویژگی های فوق العاده در کار با MVC می باشد . Friendly URL حتی بهتر هم میباشد . مقاله ای که برای شما آماده کرده ایم ، راه مناسبی برای کار با Friendly URL ها می باشد .

URLهای Dynamic و Friendly با استفاده از MVC

خب ، حال به سراغ یکسری قرارداد ها می رویم :

1. URLها باید درون یک Repository ذخیره شوند . این بدان معناست که ما قصد ایجاد و تغییر یک URL را در Repository خود داریم .
2. یک یا چندین URL میتوانند به یک Controller/Action اشاره داشته باشند . این بدان معناست که ما میخواهیم که URL ها نام داشته باشند . 
3. اگر یک URL در Repository ما وجود ندارد ، سعی کنید با استفاده از رفتارهای پیش فرض Controllerها و Action ها در MVC این مسئله را مرتفع سازید . این بدان معناست که ، رفتار های پیش فرض MVC هنوز کار خواهند کرد . 
4. URL نمی تواند در انتها شامل ID باشند . این بدان معناست که آخرین قسمت ، میتواند شامل یک ID Number طولانی باشد . 

اول از همه ، MVC دارای ساختار درونی برای URL های dynamic و Friendly نمی باشد . شما باید کدهای خودتان رو بنویسید . 

برای Solution ما به قسمت های زیر نیاز داریم :

1. پروژه MVC 
2. یک کلاس برای مدیریت درخواست های Route
3. یک Route Repository
4. Controllerها و Viewها 

ما از پایگاه داده برای ذخیره سازی این URL ها استفاده نمیکنیم ما از Repository Pattern و Dependency Resolver برای پیکربندی این استفاده میکنیم . بنابراین ، شما میتوانید در آینده یک پایگاه داده Reository ایجاد کنید . 

کلاسی که یک URL را میشناسد :

Handlers/UrlHandler.cs :

public sealed class UrlHandler {  
    public static UrlRouteData GetRoute(string url) {  
        url = url ? ? "/";  
        url = url == "/" ? "" : url;  
        url = url.ToLower();  
  
        UrlRouteData urlRoute = null;  
  
        using(var repository = DependencyResolver.Current.GetService < IRouteRepository > ()) {  
            var routes = repository.Find(url);  
            var route = routes.FirstOrDefault();  
            if (route != null) {  
                route.Id = GetIdFromUrl(url);  
                urlRoute = route;  
                urlRoute.Success = true;  
            } else {  
                route = GetControllerActionFromUrl(url);  
                urlRoute = route;  
                urlRoute.Success = false;  
            }  
        }  
  
        return urlRoute;  
    }  
  
    private static RouteData GetControllerActionFromUrl(string url) {  
        var route = new RouteData();  
  
        if (!string.IsNullOrEmpty(url)) {  
            var segmments = url.Split('/');  
            if (segmments.Length >= 1) {  
                route.Id = GetIdFromUrl(url);  
                route.Controller = segmments[0];  
                route.Action = route.Id == 0 ? (segmments.Length >= 2 ? segmments[1] : route.Action) : route.Action;  
            }  
        }  
  
        return route;  
    }  
  
    private static long GetIdFromUrl(string url) {  
        if (!string.IsNullOrEmpty(url)) {  
            var segmments = url.Split('/');  
            if (segmments.Length >= 1) {  
                var lastSegment = segmments[segmments.Length - 1];  
                long id = 0;  
                long.TryParse(lastSegment, out id);  
  
                return id;  
            }  
        }  
  
        return 0;  
    }  
} 


Route Handler که تمام درخواست ها را مدیریت میکند . 

public IHttpHandler GetHttpHandler(RequestContext requestContext)   
{  
    var routeData = requestContext.RouteData.Values;  
    var url = routeData["urlRouteHandler"] as string;  
    var route = UrlHandler.GetRoute(url);  
  
    routeData["url"] = route.Url;  
    routeData["controller"] = route.Controller;  
    routeData["action"] = route.Action;  
    routeData["id"] = route.Id;  
    routeData["urlRouteHandler"] = route;  
  
    return new MvcHandler(requestContext);  
}  

پیکربندی Route Handler :

App_Start/RouteConfig.cs :

public class RouteConfig   
{  
    public static void RegisterRoutes(RouteCollection routes)   
  {  
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
  
        routes.MapRoute(  
            "IUrlRouteHandler",  
            "{*urlRouteHandler}").RouteHandler = new UrlRouteHandler();  
    }  
}  

Repository/IRouteRepository.cs :

public interface IRouteRepository: IDisposable   
{  
    IEnumerable < RouteData > Find(string url);  
} 

Repository/StaticRouteRepository.cs :

public class StaticRouteRepository: IRouteRepository  
{  
    public void Dispose() {  
  
    }  
  
    public IEnumerable < RouteData > Find(string url) {  
        var routes = new List < RouteData > ();  
        routes.Add(new RouteData() {  
            RoouteId = Guid.NewGuid(),  
                Url = "how-to-write-file-using-csharp",  
                Controller = "Articles",  
                Action = "Index"  
        });  
        routes.Add(new RouteData() {  
            RoouteId = Guid.NewGuid(),  
                Url = "help/how-to-use-this-web-site",  
                Controller = "Help",  
                Action = "Index"  
        });  
  
        if (!string.IsNullOrEmpty(url)) {  
            var route = routes.SingleOrDefault(r => r.Url == url);  
            if (route == null) {  
                route = routes.FirstOrDefault(r => url.Contains(r.Url)) ? ? routes.FirstOrDefault(r => r.Url.Contains(url));  
            }  
  
            if (route != null) {  
                var newRoutes = new List < RouteData > ();  
                newRoutes.Add(route);  
  
                return newRoutes;  
            }  
        }  
  
        return new List < RouteData > ();  
    }  
} 

ما دو URL ایجاد کردیم ، ک URL به HelpController اشاره دارد درحالی که دیگری به ArticleController اشاره میکند . برای پیکربندی Dependency Resolver ما از Ninject استفاده میکنیم . 

App_Start/NinjectWebCommon.cs :

private static void RegisterServices(IKernel kernel)  
{  
    kernel.Bind < Repository.IRouteRepository > ().To < Repository.StaticRouteRepository > ();  
} 
دانلود فایل های ضمیمه مخصوص اعضای سایت می باشد !
کاربر مهمان! جهت دانلود و استفاده از امکانات سایت لطفا وارد سایت شوید و یا ثبت نام کنید
دانلود نسخه ی PDF این مطلب