如何根据查询字符串参数在母版页上添加元标记

时间:2014-02-07 18:50:02

标签: c# asp.net asp.net-mvc

如何根据浏览器的查询字符串参数添加更改的元标记?

例如,在我的博客网站上,博客是从数据库中读取的,示例博客是http://www.example.com/blog/blog.aspx?ID=32

我希望为不同的博客文章定制元标记,这些文章都可以从blog.aspx文件中读取。

以下帖子给了我一个想法,但是如何实现一个语句来读取查询字符串参数?

How to add meta tags on a master page for ASP.Net MVC 2

How to pass page's meta tags in ASP.NET MVC?

2 个答案:

答案 0 :(得分:0)

通常在这种情况下,我为所有视图模型都有一个基类,例如:

public abstract BasicViewModel
{
    public List<string> MetaTags {get; set; }
}

现在,如果我们假设我们网站上的每个视图模型都继承自此视图模型,那么我们可以在布局中使用强类型视图模型。

@model BasicViewModel
<html>
    <head>
       <!-- Render meta tags here from view model -->
    </head>
    @RenderBody()
</html>

我省略了一个事实,即Meta标签可能比字符串更复杂,但你明白了。

在您的控制器中,只要他们的视图模型派生自此 - 您可以自由地将任何元标记添加到视图模型中。这也适用于页面标题和每个页面常见的任何其他内容(例如,Google Analytic帐户详细信息!)。

答案 1 :(得分:0)

要获取动态元关键字和描述,请使用“操作过滤器”来解决此问题。

创建一个Action过滤器并处理其OnActionExecuted方法 -

public class MetaDataAttribute : ActionFilterAttribute
{
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        var key = filterContext.RouteData.Values["id"];

        // using key get proper keywords and description for page

        filterContext.Controller.ViewBag.MetaKeywords = "1, 2, 3";
        filterContext.Controller.ViewBag.MetaDescription = "This is new description";
    }
}

然后使用元数据属性标记控制器操作 -

    [MetaData]
    public ActionResult Index(string id)
    {
        return View();
    }

如果id是您期望操作的动态查询字符串,则在调用OnActionExecuted时操作结束时,将使用RouteData在Action过滤器中访问id。

比如说,您到达网址 - http://localhost:5738/Blog/Index/123,然后以这种方式在动作过滤器中访问ID -

enter image description here

然后根据id值,您可以在ViewBag中设置正确的关键字和描述。然后从Viewbag中,您可以获得_Layout.cshtml中的值,如下所示 -

<meta name="keywords" content="@ViewBag.MetaKeywords">
<meta name="description" content="@ViewBag.MetaDescription"/>

因此,当呈现页面时,您的元关键字和描述将反映如下 -

<meta name="keywords" content="1, 2, 3">
<meta name="description" content="This is new description"/>