如何根据浏览器的查询字符串参数添加更改的元标记?
例如,在我的博客网站上,博客是从数据库中读取的,示例博客是http://www.example.com/blog/blog.aspx?ID=32
我希望为不同的博客文章定制元标记,这些文章都可以从blog.aspx文件中读取。
以下帖子给了我一个想法,但是如何实现一个语句来读取查询字符串参数?
答案 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 -
然后根据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"/>