ورود

View Full Version : حذف Index در url



iman_Delphi7
دوشنبه 01 مرداد 1403, 19:22 عصر
سلام خدمت همه دوستان عزیز.
یه سوال داشتم. یه سایت داریم که یک کنترلر داره به اسم Products. یک اکشن به اسم Index هم داره که یه ورودی id هم میگیره. ما سه نوع آدرس داریم :
اول فرض می کنیم یک محصول داریم به اسم My-Software و با شناسه(id) 5
www.domain.com/Products (http://www.domain.com/Products) که با فراخوانی این آدرس، کاربر لیست محصولات را مشاهده می کند.
www.domain.com/Products/My-Software (http://www.domain.com/Products/My-Software) که با فراخوانی این آدرس صفحه معرفی محصول My-Software نمایش داده می شود.
www.domain.com/Products/5 (http://www.domain.com/Products/5) که با فراخوانی این آدرس میخوام به لینک بالا ریدایرکت 302 بشه. (RedirectPermanent)

من تو فایل RouteConfig این کد رو اضافه کردم:

routes.MapRoute(
name: "Products",
url: "Products/{id}",
defaults: new { controller = "Products", action = "Index", id = UrlParameter.Optional }
);


اکشن Index هم به این صورت نوشته :

public ActionResult Index(string id)
{
if (string.IsNullOrEmpty(id))
{
var ProductList = repP.GetProductList();
return View(ProductList);
}
else
{
try
{
int pid = Convert.ToInt32(id);
var p = repP.GetProductByID(pid);
if (p != null)
return RedirectToActionPermanent("", "Products", new { id = p.prdxtraUrlTitle });
else
return RedirectToAction("");
}
catch (Exception)
{
var p = repP.GetProductByUrl(id);
if (p != null)
return View("Product", p);
else
return RedirectToAction("");
}
}
}


مشکل اینجاست که الان چون اکشن Index داریم این url ها رو هم داریم :
www.domain.com/Products/Index/My-Software
www.domain.com/Products/Index/1
و چون این url ها تو گوگل ایندکس میشه تو سئو به مشکل میخوریم. چون داپلیکیت محسوب میشه. دو تا آدرس با محتوای یکسان.
در واقع من می خوام فقط یک URL داشته باشم که اینه : www.domain.com/Products/My-Software (http://www.domain.com/Products/My-Software)

به همین دلیل اومدم توی action اینطوری نوشتم که اگر با لینکی که با id که عددی بود اومد، ریدایرکت کنه به لینک با اسم محصول. نمی دونم چرا تو URL نهایی اینو میاره : www.domain.com/Products/Index/My-Software
اصلا چطوری می تونم این Index رو ورش دارم؟ نمیخوام Index داشته باشم تو url ها.
ممنون میشم راهنماییم کنید. سپاس.

_behnam_
چهارشنبه 03 مرداد 1403, 02:54 صبح
سلام
میتونید از Attribute Routing استفاده کنید
قدم اول از کلاس RouteConfig.cs باید Attribute Routing فعال کنید , با قرار دادن کد routes.MapMvcAttributeRoutes();



public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
}

و بعد توی کنترلر بالای متد index باید Attribute رو قرار بدید که واسه شما به شکل زیر درمیاد

[Route("Products/My-Software/{id}")]
public ActionResult Index(string id)

درضمن بهتره که نوع پارامتر های کنترلر نزدیک به نوع آرگومان هایی ورودی باشه تا کدهای کمتری رو بخواید بنویسید.
مثلا نوع پارامتر Id بجای string بهتره int تعریف بشه تا کدهای تبدیل و try/catch اضافی حذف بشه



[Route("Products/My-Software/{id}")]
public ActionResult Index(int? id)





id.HasValue return true if not null
id.GetValueOrDefault() return 0 if null or return > 0 if not null

iman_Delphi7
شنبه 06 مرداد 1403, 17:59 عصر
ممنون از شما. با تغییراتی در کدهای ارسالی شما، مشکل بنده حل شد. سپاس فراوان.