/ / Como reescrever URL em MVC 5 para páginas populadas dinamicamente - asp.net-mvc, model-view-controller, url-rewriting, asp.net-mvc-5, url-routing

Como reescrever a URL no MVC 5 para páginas dinamicamente preenchidas - asp.net-mvc, model-view-controller, url-reescrita, asp.net-mvc-5, url-routing

Estou apenas criando um aplicativo da Web baseado em banco de dados. Para este propósito, criei um Controlador:

public class PagesController : Controller
{
private StoreDB db = new StoreDB();

public ActionResult LoadOneColumnPageContent(string pageId)
{
List<tbl_UserControl> tbl_UserControls = db.tbl_UserControl.Where(it => it.Active == true && it.PageId == pageId).OrderBy(it => it.Id).ToList();
return View(tbl_UserControls);
}
public ActionResult LoadFullWidthPageContent(int id)
{
List<tbl_UserControl> tbl_UserControls = db.tbl_UserControl.Where(it => it.Id == id).ToList();
return View(tbl_UserControls);
}
}

Que preenche o modelo

public partial class tbl_UserControl
{
private int? _priority;

[Key]
public int Id { get; set; }

[AllowHtml]
public string Title { get; set; }

[AllowHtml]
public string Subtitle { get; set; }

[AllowHtml]
[DataType(DataType.MultilineText)]
public string MainText { get; set; }

[StringLength(20)]
public string ButtonText { get; set; }

public string ImageUrl { get; set; }

public string UrlLink { get; set; }

public string PageId { get; set; }

public string TypeId { get; set; }
}

E exibe os dados na Visualização:

    @using Microsoft.Ajax.Utilities
@model IEnumerable<newSiteMVC.Models.tbl_UserControl>
@{
ViewBag.Title = "LoadOneColumnPageContent";
Layout = "~/Views/Shared/_Layout.cshtml";
}

@*<%--------------------- Top Banner with moving image ---------------------%>*@

@Html.Partial("~/Views/Pages/Shared/_PageTopBanner.cshtml", Model)

@*<%--------------------- Main page content ---------------------%>*@

@foreach (var item in Model.Where(it => it.TypeId != "NewsFeed" && it.PageId == @Request.QueryString["pageId"]))
{
if ( item.TypeId != "TopBanner" && item.TypeId != "TwoColumn" && item.TypeId != "VideoPod")
{
if (string.IsNullOrEmpty(item.ImageUrl))
{
@Html.Partial("~/Views/Pages/Shared/_OneColumnComponent.cshtml", item)
}
else
{
@Html.Partial("~/Views/Pages/Shared/_OneColumnWithImageComponent.cshtml", item)
}
}
}
@if (@Request.QueryString["pageId"] == "InTheNews")
{
@Html.Partial("~/Views/Pages/Shared/_OneColumnWithLinkComponent.cshtml", Model)

}

@if (@Request.QueryString["pageId"] == "ContactUs")
{
@Html.Partial("~/Views/Pages/Shared/_FullWidthContactPage.cshtml", Model)

}

@if (@Request.QueryString["pageId"] == "ShoppingCart")
{
@Html.Partial("~/Views/Pages/Shared/_TwoColumnComponent.cshtml", Model)

}

@*<%--------------------- Moving Background Image ---------------------%>*@

@Html.Partial("_MovingBackgroundImage")

Neste exato momento, o aplicativo da web mostra os dois seguintes padrões de url:

http://localhost:63294/Pages/LoadFullWidthPageContent/54

Ou

http://localhost:63294/Pages/LoadOneColumnPageContent?pageId=ContactUs
http://localhost:63294/Pages/LoadOneColumnPageContent?pageId=AboutUs

Eu queria saber se há alguma maneira de fazer oURL mais amigável para SEO, levando em consideração que todas as páginas são carregadas através do mesmo controlador e ação (dados diferentes são exibidos para cada pageId) além de duas páginas que usam ações diferentes no mesmo controlador. Eu gostaria que os links fossem parecidos com

 www.somewebsite.com/News/54
www.somewebsite.com/ContactUs
www.somewebsite.com/AboutUs

É mesmo possível e se assim for, alguma idéia de como eu poderia implementá-lo?

Respostas:

2 para resposta № 1

Esta não é uma resposta completa, mas estou tentando lhe dar uma dica, como trabalhei em tipos semelhantes de rotas, torne a página mais amigável para SEO. Se isso puder ajudar, você pode usar.

         var route1 = routes.MapRoute(
name: "Products",
url: "Clothes/{param1}/{param2}",
defaults: new { controller = "Products", action = "Clothes", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional }
);

Aqui Param1 e Param2 são opcionais, você pode adicionar qualquer coisa lá.

Como no seu caso, você pode adicionar

www.somewebsite.com/content/News/54

         var route1 = routes.MapRoute(
name: "Page",
url: "Content/{param1}/{param2}",
defaults: new { controller = "Page", action = "LoadOneColumnPageContent", param1 = UrlParameter.Optional, param2 = UrlParameter.Optional }
);