我一直在编写一个关于funsies的论坛,我最终会创建一个sharepoint加载项。我目前无法解决_Layout.cshtml页面的问题,因为在Visual Studio 2010中页面的布局与2013年不同。没问题,我的页面仍然知道导航栏上有一个头像但是在2013年,它拒绝展示当时的情况。下面提供的代码和屏幕截图链接。
Visual Studio 2013(已损坏):
_Layout.cshtml 2013 :
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<title>@ViewBag.Title - Forum</title>
<link href="~/favicon.ico" rel="shortcut icon" type="image/x-icon" />
<meta name="viewport" content="width=device-width" />
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<header>
<div class="content-wrapper">
<div class="float-left">
<p class="site-title"> <img src="#" /></p>
</div>
<div class="float-right">
<section id="login">
@Html.Partial("_LoginPartial")
</section>
<nav>
<ul id="menu">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Forums", "Index", "Forum")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
<li>@Html.ActionLink("Avatar", "SelectAvatar", "Avatar")</li>
@Html.Action("Avatar", "Layout")
</ul>
</nav>
</div>
</div>
</header>
<div id="body">
@RenderSection("featured", required: false)
<section class="content-wrapper main-content clear-fix">
@RenderBody()
</section>
</div>
<footer>
<div class="content-wrapper">
<div class="float-left">
<p>© @DateTime.Now.Year - ID</p>
</div>
</div>
</footer>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@RenderSection("scripts", required: false)
</body>
</html>
LayoutController.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using LbForum.Models;
namespace LbForum.Controllers
{
public class LayoutController : Controller
{
private IStateRepository stateRepository = null;
public LayoutController()
: this(new SessionStateRepository())
{
}
public LayoutController(IStateRepository sessionStateRepository)
{
this.stateRepository = sessionStateRepository;
}
//
// GET: /Layout/
public ContentResult Avatar()
{
string imgPath = "~/Images/Avatars";
ForumUserState forumUserState = stateRepository.GetForumUserState();
if (forumUserState.AvatarFileName != string.Empty)
{
imgPath += forumUserState.AvatarFileName;
}
else
{
imgPath += "avatar1.jpg";
}
string imgTag = string.Format("<img src='{0}' alt='User Avatar' width='40' height='40'/>", imgPath);
return new ContentResult() { Content = imgTag };
}
}
}
Visual Studio 2010(已修复):
_Layout.cshtml 2010 :
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>@ViewBag.Title - Forum</title>
@Styles.Render("~/Content/css")
@Scripts.Render("~/bundles/modernizr")
</head>
<body>
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"><</span>
<span class="icon-bar"></span>
</button>
@Html.Raw(@Html.ActionLink("[replacetext]", "Index", "Home",
new { area = "" },
new { @class = "navbar-brand" })
.ToHtmlString().Replace("[replacetext]",
"<img src=\"/images/forum.jpg\" alt=\"QA Forum logo\" />"))
</div>
<div class="navbar-collapse collapse ">
<ul class="nav navbar-nav">
<li>@Html.ActionLink("Home", "Index", "Home")</li>
<li>@Html.ActionLink("Forums", "Index", "Forum")</li>
<li>@Html.ActionLink("Threads", "Index", "Thread")</li>
<li>@Html.ActionLink("Posts", "Index", "Post")</li>
<li>@Html.ActionLink("About", "About", "Home")</li>
<li>@Html.ActionLink("Contact", "Contact", "Home")</li>
<li>@Html.ActionLink("Avatar", "SelectAvatar", "Avatar")</li>
<li>@Html.ActionLink("Admin", "Index", "Admin")</li>
@Html.Action("Avatar", "Layout")
</ul>
@Html.Partial("_LoginPartial")
</div>
</div>
</div>
<div class="container body-content">
@RenderBody()
<hr />
<footer>
<p>© @DateTime.Now.Year - ID</p>
</footer>
</div>
@Scripts.Render("~/bundles/jquery")
@Scripts.Render("~/bundles/jqueryval")
@Scripts.Render("~/bundles/bootstrap")
@RenderSection("scripts", required: false)
</body>
</html>
答案 0 :(得分:2)
现在我们有了'meat'n'potatoes ......
您的2010示例(正在运行)只是引用/images/forum.jpg
(它似乎作为您网站上的资产存在)。所以一切都很好。
出现2012版本,您试图重构为ChildAction。通过这样做,您还可以切换资源的位置,引用~/Images/avatars
而不仅仅是/Images/avatars
(请注意代字号)。
对于最简单的“检查它是否有效”路径(假设您的/images/forum.jpg
文件仍然存在),请尝试在您的子操作中首先输出硬编码值:
public ContentResult Avatar()
{
string imgPath = "/images/forums.jpg"; // Hard-coded
string imgTag = string.Format("<img src='{0}' alt='User Avatar' width='40' height='40'/>", imgPath);
return new ContentResult() { Content = imgTag };
}
如果可行,则与组装路径的方式有关。请记住,客户的位置应该与您的网站相关,因此~/
对他们来说没有任何意义。
一些一般性指导:
[ChildActionOnly]
修饰此操作,以避免被直接调用。获取要点1&amp; 2并应用它们:
<强> LayoutController.cs 强>:
public class LayoutController : Controller
{
/* snip */
// Hard-coded values should be const
const String AvatarDefaultImage = "avatar1.jpg";
[ChildActionOnly]
public PartialViewResult Avatar()
{
var forumUserState = stateRepository.GetForumUserState();
if (!String.IsNullOrEmpty(forumUserState.AvatarFileName))
{
// Pass off the URL as the model
return PartialView(model: forumUserState.AvatarFileName);
}
// default fallback
return PartialView(model: AvatarDefaultImage);
}
}
<强>〜/查看/布局/ Avatar.cshtml 强>:
@model String
<img src="/Images/Avatars/@Model" alt="User Avatar" width="40" height="40"/>