来自HostingEnvironment.MapPath的堆栈溢出异常

时间:2016-04-12 19:42:00

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

所以我有一个控制器在我的项目中打开一个Json文件,如下所示:

public class SharedController : Controller
{
        string filePath = HostingEnvironment.MapPath(@"~/App_Data/MenuItems.json");

    // GET: Shared
    [ChildActionOnly]
    public ActionResult _Menu()
    {
        StreamReader sr = new StreamReader(filePath);

        string JsonString = sr.ReadToEnd();
        JsonSerializerSettings settings = new JsonSerializerSettings
        {
            TypeNameHandling = TypeNameHandling.All
        };

        var menuItems = JsonConvert.DeserializeObject<List<MenuItem>>(JsonString, settings);


        return View(menuItems.ToList());
    }
}

当它是我的家庭控制器的一部分并使用Html.Partial调用时,此代码有效。

但是现在我从SharedController中做到这一点,在我的布局中使用Html.Action调用它,如下所示:

        @Html.Action("_Menu", "Shared")

我得到的错误是:

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll

为什么会发生这种情况以及如何在不收到错误的情况下获取文件路径?

更新:我很确定HostingEnvironment.MapPath导致了错误,因为如果我尝试以不同的方式分配路径而我没有收到该错误,那么我找不到一个&#39;文件夹;新的StreamReader行上出错。

1 个答案:

答案 0 :(得分:3)

我认为它是以递归方式调用_Menu操作方法,可能是因为您用于菜单的部分视图仍然使用相同的布局,再次调用_Men u操作方法和此循环永远不会结束,直到内存耗尽。

您有2个选项

  1. 调用PartialView()方法而不是View()方法。

    return PartialView(menuItems.ToList());
    
  2. 确保呈现菜单项的视图不使用与其布局相同的布局。您可以在_Menu.cshtml视图中将布局显式设置为null。

    @model List<MenuItem>
    @{  Layout = null; }
    <p>Your markup for menu goes here</p>