头像显示视觉工作室更改查询

时间:2015-07-16 12:20:57

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

我一直在编写一个关于funsies的论坛,我最终会创建一个sharepoint加载项。我目前无法解决_Layout.cshtml页面的问题,因为在Visual Studio 2010中页面的布局与2013年不同。没问题,我的页面仍然知道导航栏上有一个头像但是在2013年,它拒绝展示当时的情况。下面提供的代码和屏幕截图链接。

Visual Studio 2013(已损坏): Visual Studio 2013 result

_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>&copy; @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(已修复): Visual Studio 2010 result

_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>&copy; @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>

1 个答案:

答案 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 };
    }

如果可行,则与组装路径的方式有关。请记住,客户的位置应该与您的网站相关,因此~/对他们来说没有任何意义。

一些一般性指导:

  1. 使用[ChildActionOnly]修饰此操作,以避免被直接调用。
  2. 使用视图并将其作为模型传递给它,以避免混合逻辑/演示。
  3. 考虑将此代码一起移动到HtmlHelper中,避免往返另一个控制器。
  4. 获取要点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"/>