Controller中的Action方法是永久调用的

时间:2015-02-15 15:44:24

标签: c# asp.net-mvc razor

我正在创建我的网站时遇到问题。试图调试它,我注意到当我点击F5运行该网站时,它一直在创建一个创建的管理器之上创建网站,并一直反复调用操作方法,最终firefox最终吃了所有的CPU 。我注意到这是代码:

Layout = "~/Views/Shared/_Layout.cshtml";

导致它。如果我从View中删除此代码,它可以正常工作。知道可能是什么问题吗?

我的观点如下:

   @model WebApplication1.Models.IndexViewModel

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<div class="pageContentDiv">
    <h2>@ViewBag.Title</h2>
    <p>Lorem</p>
</div>

我的布局如下:

    <!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@ViewBag.Title - My ASP.NET Application</title>
    @Styles.Render("~/Content/css")
    @Scripts.Render("~/bundles/modernizr")

    <script src="~/Scripts/jquery-1.10.2.min.js"></script>

    <link href="~/Scripts/jquery-ui.min.css" rel="stylesheet" />
    <script src="~/Scripts/jquery-ui.min.js"></script>
    <script src="~/Scripts/OwnedScripts/InitializeUI.js"></script>
    <script type="text/javascript">
        $(document).ready(function () {
            initUI();
        });        
    </script>
</head>
<body>
    <div class="topMenu">
       <div id="topMenuContentDiv" style="margin-left: 110px;">
           <ul>
               <li>@Html.ActionLink("Home", "Index", "Home")</li>
               <li>@Html.ActionLink("Roads", "Recs", "Home")</li>
               <li>@Html.ActionLink("Software", "Software", "Home")</li>
               <li>@Html.ActionLink("About", "About", "Home")</li>
               <li>@Html.ActionLink("Contact", "Contact", "Home")</li> 
           </ul>
       </div>
    </div>

    <div class="contentDiv" id="#contentDiv">
        <div id="decor" style="height: 640px; float: right;">
            <div id="decorPNG" style="background-image: url('../Images/VisualImages/decor.png'); width: 300px; height: 64px;
                float: right; margin-right: -20px; margin-top: 100px;">
            </div>
        </div>

        <div id="logoDiv">
            <h1>QitozNet</h1>
        </div>

        @RenderBody()

      <footer class="footer">
          <p>&copy; @DateTime.Now.Year - All rights reserved</p>
          <hr />
      </footer>        
    </div>
</body>
</html>

控制器看起来像这样:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {

        public ActionResult Index()
        {
            return View();
        }

       public ActionResult Recs()
        {
            return View();
        }

        public ActionResult About()
        {
            ViewBag.Message = "Temp";

            return View();
        }

        public ActionResult Software()
        {
            return View();
        }

        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }        

    }
}

Index方法被一遍又一遍地调用,似乎在一个永恒的循环中返回。在调试它时,我一直按下F10(跳过)5分钟,并意识到它只是重新创建页面,但在较旧的页面之上,所以它最终复制了网站

我还尝试从视图中删除:Layout = "~/Views/Shared/_Layout.cshtml";,以便它们只驻留在:_ViewStart.cshtml但没有运气

initGUI脚本如下所示:

    function initUI() {
    $(".topMenu").tabs();
    $("#logoDiv").toggle("slide", { direction: 'left' }, 2000);

    $("#decorPNG").mouseover(function () {
        $(this).css("cursor", "pointer");
        $(this).draggable({ axis: 'y', containment: "#decor" });
    });
}

1 个答案:

答案 0 :(得分:2)

您的问题在这里:

<div class="topMenu">
   <div id="topMenuContentDiv" style="margin-left: 110px;">
       <ul>
           <li>@Html.ActionLink("Home", "Index", "Home")</li>
           <li>@Html.ActionLink("Roads", "Recs", "Home")</li>
           <li>@Html.ActionLink("Software", "Software", "Home")</li>
           <li>@Html.ActionLink("About", "About", "Home")</li>
           <li>@Html.ActionLink("Contact", "Contact", "Home")</li> 
       </ul>
   </div>
</div>

使用jQueryUI选项卡时,它使用锚标记将内容加载到该选项卡中,然后在单击时显示内容。您的问题是Home控制器Index操作位于您的菜单中,而默认项目则是递归循环。

如果您真的想使用jQueryUI选项卡,那么您应该禁用当前页面的href ActionLink。或者,您应为PartialViews呈现ActionLinks,并使用您的主页/索引作为容器。然后你的应用程序将更像SPA(单页面应用程序)。

根据您的目标,以下是两种可能的解决方案: 实现我认为您正在寻找使用jQuery UI的一种方法。将您的索引操作和查看复制到另一个名称,例如&#34;默认&#34;。然后更改该操作和所有其他操作以返回PartialViews。

public PartialViewResult Default()
{
    // do stuff
    return PartialView();
}

然后删除您不想在所有页面上显示的索引操作中的任何代码。现在这将是您的容器,然后您的选项卡将呈现所有这些页面的部分视图。您的PartialView将呈现与之前完全相同的代码,但不会显示_Layout.cs文件。这些仍将使用ActionLink文件中的.cshtml方法。

第二种方法是使用Bootstrap Tabs。这就是CSS方法,你可以添加css类&#34; active&#34;基于活动页面,不对ActionResults进行任何更改。