با سلام – در این مقاله به آموزش ایجاد آدرسهای کاربر پسند در برنامه های Asp.net خواهم پرداخت
User friendly بودن URLs فقط برای کاربران سایت مورد پسند نیست بلکه برای برای موتورهای جستجو و سئوی سایت نیز بسیار مفید خواهد بود. لطفا به ادامه مطلب توجه بفرمایید
آموزش را با یک مثال آغاز میکنیم.
در یک پروژه معمولی جهت نمایش لیستی از محصولات بگونه ای که کاربر با کلیک بر روی هر محصول بتواند جزییات محصول مورد نظر را ببیند بشکل زیر خواهد بود.
کلاس محصولات :
public class Product
{
public string Description { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public float Price { get; set; }
}
معمولا پس از اجرای برنامه لیست محصولات بصورت زیر نمایش داده خواهد شد.
سپس با کلیک بر روی یک محصول جزییات آن با توجه به شکل زیر نمایش داده خواهد شد.
لطفا به url آن دقت نمایید.
معمولا URL هایی که بصورت عادی نمایش داده میشوند فیلد id داده یا محصول مورد نظر را به کنترلر و اکشن ارسال میکنند.اما برای ایجاد URL های کاربر پسند نام محصول را نیز در قسمت آدرس آن نمایش میدهند. برای انجام اینکار مراحل زیر را دنبال کنید.
کلاس Product را بصورت زیر ایجاد نمایید.
public class Product
{
public string Description { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public float Price { get; set; }
public string GenerateSlug()
{
string phrase = string.Format("{0}-{1}", Id, Name);
phrase = Regex.Replace(phrase, @"[^a-z0-9-\u0600-\u06FF]", "-");
phrase = Regex.Replace(phrase, @"\s+", "-").Trim();
phrase = Regex.Replace(phrase, @"-+", "-");
return phrase;
}
private string RemoveAccent(string text)
{
var bytes = Encoding.GetEncoding("UTF-8").GetBytes(text);
return Encoding.UTF8.GetString(bytes);
}
}
سپس ویوی نمایش لیستی از محصولات را بصورت زیر ویرایش نمایید . تا با کلیک بر روی یک محصول URL آن بجای نمایش کد محصول که ترکیبی از کد و عنوان محصول را با فرمتی که در کلاس Product تعیین کردیم نمایش داده شود.
@model IEnumerable<SeoFriendlyUrls.Models.Product>
<h2>Product List</h2>
<table >
<thead>
<tr>
<th>Name</th>
<th>Price</th>
<th>Image</th>
</tr>
</thead>
<tbody>
@foreach (var product in Model)
{
<tr>
<td><a href="@Url.Action("Details", "Products", new { id = @product.GenerateSlug() })">@product.Name</a></td>
<td>@product.Price</td>
<td><img src="ادرس یک تصویر درج شود"/></td>
</tr>
}
</tbody>
</table>
در صورتیکه اکنون برنامه را اجرا کنید قطعا با خطا مواجه میشود چرا که اکشن نمایش جزییات هر محصول با ID ان محصول در ارتباط میباشد اما این در حالیست که بخشی از url ما دارای مقادیر رشته ای میباشد و اکشن قادر به تبدیل رشته به عدد نمی باشد
public ActionResult Details(int id)
{
...
}
برای حل این مشکل نیاز به مدیریت RouteData میباشد.
از داخل پوشه App_Start کلاس RouteConfig را باز نمایید و کلاس SeoFriendlyRoute را به انتهای کلاس RouteData اضافه نمایید.
public class SeoFriendlyRoute : Route
{
public SeoFriendlyRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler) : base(url, defaults, routeHandler)
{
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
var routeData = base.GetRouteData(httpContext);
if (routeData != null)
{
if (routeData.Values.ContainsKey("id"))
routeData.Values["id"] = GetIdValue(routeData.Values["id"]);
}
return routeData;
}
private object GetIdValue(object id)
{
if (id != null)
{
string idValue = id.ToString().Substring(0,1);
var regex = new Regex(@"^(?<id>\d+).*$");
var match = regex.Match(idValue);
if (match.Success)
{
return match.Groups["id"].Value;
}
}
return id;
}
}
با استفاده از کلاس فوق مقدار ID موجود در Url را بدست می اوریم.
جهت استفاده از کلاس SeoFriendlyRoute متد RegisterRoutes از کلاس RouteConfig را بصورت زیر ویرایش نمایید.
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.Add("ProductDetails", new SeoFriendlyRoute("products/details/{id}",
new RouteValueDictionary(new { controller = "Products", action = "Details" }),
new MvcRouteHandler()));
routes.MapRoute("Default", "{controller}/{action}/{id}", new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
سپس برنامه را اجرا نمایید.
به url تصویر فوق دقت نمایید.
جهت عضویت در کانال فکر بکر بر روی لینک زیر کلیک نمایید :
https://Telegram.me/learningprograming