3

我只是在创建数据库驱动的Web应用程序。为了这个目的,我创建了一个控制器:如何重写URL在MVC 5动态填充网页

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); 
    } 
} 

其中填充型

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; } 
} 

并在视图显示数据:

@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") 

在这个非常时刻的Web应用程序显示以下两个URL模式:

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

或者

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

我想知道是否有什么办法可以让URL更加SEO友好的,因为考虑到所有页面都通过相同的控制器和动作加载(不同的数据将显示每个PAGEID)除了帐户两个页面在同一个控制器中使用不同的操作。我想的链接,看起来像

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

它甚至有可能,如果这样任何想法如何,我可以实现它?

回答

2

这是不完整的答案,但想给你一个提示,由于我的工作类似那种路线使页面更加搜索引擎友好。如果它可以帮助您可以利用的。

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

这里参数1和参数都是可选的,你可以有添加任何东西。

像你的情况,你可以添加

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 } 
      ); 
+0

这真是棒极了! :) – user3845868

+0

只有最后一个参数可以被标记'UrlParameter.Optional' –