gpt4 book ai didi

c# - 如何将动态数据写入 MVC 3 Razor 中的页面布局?

转载 作者:可可西里 更新时间:2023-11-01 07:45:03 27 4
gpt4 key购买 nike

我有带 Razor 引擎的 MVC 3 C# 项目。将动态数据写入 _Layout.cshtml 的方法和最佳实践是什么?

例如,也许我想在我网站的右上角显示用户名,并且该名称来自 Session、DB 或基于用户登录的任何内容。

更新:我也在寻找将某些数据呈现到布局元素中的良好做法。例如,如果我需要根据登录用户的凭据呈现特定的 CSS 文件。

(对于上面的例子,我想到了使用 Url Helpers。)

最佳答案

Visual Studio 创建的默认 Internet 应用程序使用 _LogOnPartial.cshtml 来执行此操作。

用户名值在HomeController的LogOn Action 中设置

_LogOnPartial.cshtml 的代码

@if(Request.IsAuthenticated) {
<text>Welcome <strong>@User.Identity.Name</strong>!
[ @Html.ActionLink("Log Off", "LogOff", "Account") ]</text>
}
else {
@:[ @Html.ActionLink("Log On", "LogOn", "Account") ]
}

User.Identity 是 aspnet Membership provider 的一部分。

_Layout.cshtml 的代码

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("~/Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/modernizr-1.7.min.js")" type="text/javascript"></script>
</head>
<body>
<div class="page">
<header>
<div id="title">
<h1>Test</h1>
</div>
<div id="logindisplay">
@Html.Partial("_LogOnPartial")
</div>
<nav>
<ul id="menu">
</ul>
</nav>
</header>
<section id="main">
@RenderBody()
</section>
<footer>
</footer>
</div>
</body>
</html>

AccountController 登录操作的代码

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (Membership.ValidateUser(model.UserName, model.Password))
{
FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
&& !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
{
return Redirect(returnUrl);
}
else
{
return RedirectToAction("Index", "Home");
}
}
else
{
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}

// If we got this far, something failed, redisplay form
return View(model);
}

ApplicationViewPage 类的代码

public abstract class ApplicationViewPage<T> : WebViewPage<T>
{
protected override void InitializePage()
{
SetViewBagDefaultProperties();
base.InitializePage();
}

private void SetViewBagDefaultProperties()
{
ViewBag.LayoutModel = new LayoutModel(Request.ServerVariables["SERVER_NAME"]);
}

}

上面的代码允许我有一个 ViewBag.LayoutModel,它在每个页面中保存我的 LayoutModel 类的一个实例。

这是我的 LayoutModel 类的代码

public class LayoutModel
{
public string LayoutFile { get; set; }
public string IpsTop { get; set; }
public string IpsBottom { get; set; }
public string ProfileTop { get; set; }
public string ProfileBottom { get; set; }

public LayoutModel(string hostname)
{
switch (hostname.ToLower())
{
default:

LayoutFile = "~/Views/Shared/_BnlLayout.cshtml";
IpsBottom = "~/Template/_BnlIpsBottom.cshtml";
IpsTop = "~/Template/_BnlTop.cshtml";
ProfileTop = "~/Template/_BnlProfileTop.cshtml";
break;

case "something.com":
LayoutFile = "~/Views/Shared/_Layout.cshtml";
IpsBottom = "~/Template/_somethingBottom.cshtml";
IpsTop = "~/Template/_somethingTop.cshtml";
ProfileTop = "~/Template/_somethingProfileTop.cshtml";
break;
}
}
}

这是 View 的代码

@{
ViewBag.Title = "PageTitle";
Layout = @ViewBag.LayoutModel.LayoutFile;
}
@using (Html.BeginForm())
{
<span class="error">@ViewBag.ErrorMessage</span>
<input type="hidden" name="Referrer" id="Referrer" value="@ViewBag.Referrer" />
html stuff here
}

有关详细信息,请参阅以下问题。确保按照此处所述修改 web.config:How to set ViewBag properties for all Views without using a base class for Controllers?

关于c# - 如何将动态数据写入 MVC 3 Razor 中的页面布局?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5872998/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com