C# HostingEnvironment.MapPath中的堆栈溢出异常

C# HostingEnvironment.MapPath中的堆栈溢出异常,c#,asp.net-mvc,asp.net-mvc-4,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() {

因此,我有一个控制器,可以在我的项目中打开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.Action("_Menu", "Shared")
我得到的错误是:

An unhandled exception of type 'System.StackOverflowException' occurred in mscorlib.dll
为什么会发生这种情况,以及如何在不出错的情况下获取文件路径


更新:我非常确定HostingEnvironment.MapPath是导致错误的原因,因为如果我尝试以不同的方式分配路径,我不会得到该错误,我会得到一个“foldernotfound”;新StreamReader行出错。

我认为它是递归调用
\u菜单
操作方法,可能是因为您用于菜单的局部视图仍然使用相同的布局,该布局再次调用
\u Men
u操作方法,并且这个循环直到内存耗尽才会结束

你有两个选择

  • 调用
    PartialView()
    方法,而不是
    View()
    方法

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

    @model List<MenuItem>
    @{  Layout = null; }
    <p>Your markup for menu goes here</p>
    
    @型号列表
    @{Layout=null;}
    菜单的标记在这里


  • 我认为它是递归地调用
    \u菜单
    操作方法,可能是因为您用于菜单的局部视图仍然使用相同的布局,该布局再次调用
    \u Men
    u操作方法,并且这个循环直到内存耗尽才会结束

    你有两个选择

  • 调用
    PartialView()
    方法,而不是
    View()
    方法

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

    @model List<MenuItem>
    @{  Layout = null; }
    <p>Your markup for menu goes here</p>
    
    @型号列表
    @{Layout=null;}
    菜单的标记在这里


  • 看起来这个@Html.Action(“\u Menu”,“Shared”)是递归调用的。看起来这个@Html.Action(“\u Menu”,“Shared”)是递归调用的。是的,这就是问题所在。我不认为部分也会调用布局。将partial的布局设置为null有效。哦,是的,这是partial,所以我应该返回PartialView。我认为这是更好的解决方案,但它们都有效。谢谢是的,这就是问题所在。我不认为部分也会调用布局。将partial的布局设置为null有效。哦,是的,这是partial,所以我应该返回PartialView。我认为这是更好的解决方案,但它们都有效。谢谢