MVC3Razor中如何将动态数据写入页面布局?我有带有Razor引擎的MVC3C#项目。我想,将动态数据写入_Layout.cshtml的最佳做法是什么?例如,也许我想在我的站点的右上角显示用户名,而该名称来自会话、数据库或基于用户登录的任何其他内容。更新:我也在寻找将某些数据渲染到布局元素的良好做法。例如,如果我需要根据登录用户的凭据呈现特定的CSS文件。(对于上面的示例,我考虑过使用UrlHelpers。)visualstudio创建的默认Internet应用程序使用_LogOnPartial.cshtml来执行此操作。_LogOnPartial.cshtml@if(Request.IsAuthenticated){欢迎@User.Identity.Name![@Html.ActionLink("LogOff","LogOff","Account")]}else{@:[@Html.ActionLink("LogOn","LogOn","Account")]}User.Identity是aspnet会员提供程序的一部分。_Layout.cshtml的代码@ViewBag.TitleTest@Html.Partial("_LogOnPartial")@RenderBody()AccountController登录操作的代码[HttpPost]publicActionResultLogOn(LogOnModelmodel,stringreturnUrl){if(ModelState.IsValid){if(Membership.ValidateUser(model.UserName,model.Password)){FormsAuthentication.SetAuthCookie(model.UserName,model.RememberMe);如果(Url.IsLocalUrl(returnUrl)&&returnUrl.Length>1&&returnUrl.StartsWith("/")&&!returnUrl.StartsWith("//")&&!returnUrl.StartsWith("/\")){返回重定向(返回网址);}else{returnRedirectToAction("Index","Home");}}else{ModelState.AddModelError("","提供的用户名或密码不正确。");}}//如果我们走到这一步,有些东西失败了,重新显示表单returnView(model);}ApplicationViewPage类的代码publicabstractclassApplicationViewPage:WebViewPage{protectedoverridevoidInitializePage(){SetViewBagDefaultProperties();根据.初始化页面();}privatevoidSetViewBagDefaultProperties(){ViewBag.LayoutModel=newLayoutModel(Request.ServerVariables["SERVER_NAME"]);上面的代码允许我在LayoutModel类的每个页面实例中包含一个ViewBag.LayoutModel这是我的LayoutModel类的代码publicclassLayoutModel{publicstringLayoutFile{get;放;}publicstringIpsTop{get;放;}公共字符串IpsBottom{得到;放;}publicstringProfileTop{get;放;}publicstringProfileBottom{get;放;}publicLayoutModel(stringhostname){switch(hostname.ToLower()){默认值:LayoutFile="~/Views/Shared/_BnlLayout.cshtml";IpsBottom="~/Template/_BnlIpsBottom.cshtml";IpsTop="~/Template/_BnlTop.cshtml";ProfileTop="~/Template/_BnlProfileTop.cshtml";休息;case"something.com":LayoutFile="~/Views/Shared/_Layout.cshtml";IpsBottom="~/Template/_somethingBottom.cshtml";IpsTop="~/Template/_somethingTop.cshtml";ProfileTop="~/Template/_somethingProfileTop.cshtml";休息;}}}这是视图的代码@{ViewBag.Title="PageTitle";Layout=@ViewBag.LayoutModel.LayoutFile;}@using(Html.BeginForm()){@ViewBag.ErrorMessagehtmlstuffhere}有关详细信息,请参阅下面的问题。确保按照此处所述修改您的web.config:HowcanIsettheViewBagpropertyforallviewswithoutusingthecontroller'sbaseclass?除了atbebtg的回答之外,要想把事情放在脑子里,你还想利用Razor的部分支持。部分是模板化HTML的命名片段,可以在视图中定义并在布局认为合适时在布局中呈现。在布局中调用@RenderSection("wellKnownSectionName")并在使用布局的视图中声明@sectionwellKnownSectionName{。通常,您希望在其名称中描述该部分的用途,例如“documentHead”。更新:如果您在每个视图上呈现相同的模板化HTML,它就会进入布局。(由于您的布局包含HEAD和BODY标签,您只需将相应的代码添加到HEAD标签即可。)您只需确保通过ViewBag/View.Model从控制器传递布局所需的信息。/查看数据。因此,您的布局将包括:并且您的控制器将包含填充ViewBag.UserName的逻辑:ViewBag.UserName=Session["UserName"];(理想情况下,您会使用强类型的视图模型,我建议您不要对所有内容都使用Session,因为与替代方案相比,它的优势很小,而且构建成本很高……相反,我只建议使用用户名或其他内容存储一些加密的cookieonthebrowserwhichyoucanuseonevery在页面加载时使用它从缓存/数据库/服务中检索用户对象。)以上是C#学习教程:如何在MVC3Razor中将动态数据写入页面布局?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
