【问题标题】:My PartialView is causing my application to breakdown everytime我的部分视图导致我的应用程序每次都崩溃
【发布时间】:2017-06-01 15:38:45
【问题描述】:

我正在尝试使用数据库中的一些数据加载我的部分视图,但是当我运行应用程序时遇到以下问题:

不允许子动作执行重定向动作。

我不知道为什么会这样,因为我对 MVC 技术还很陌生。

这是我在控制器中的PartialViewResult 方法:

public PartialViewResult UnReadEmails()
{
   if (User.Id != null)
   {
      List<Emails> resultList = EmailController.GetUnreadEmailsByUserId(User.Id);
       return PartialView("~/Views/Emails/_UnReadEmails.cshtml", resultList);
   }
   return PartialView("Error, not found!");
}

这是我的部分视图本身,它被称为 _UnReadEmails(如您所见,我在这里显示有关发件人和电子邮件正文的信息),PartialView 正在检索我从控制器发送到的电子邮件列表

@model IEnumerable<Emails>

foreach (var item in Model)
{
    <li>
        <a>
            <span>
               <span>@item.EmailSender</span>
               <span class="email">
                     @item.Body;
               </span>
        </a>
    </li>
}

在我尝试以这种方式加载我的局部视图后:

@Html.Action("UnreadEmails", "Message")

我开始收到我在标题中提到的以下问题,

我已经尝试了一些方法来解决这个问题,比如将 @Html.Action("UnreadEmails", "Message") 更改为 @Url.Action("UnreadEmails", "Message") 等等,但这并没有解决我的问题。

编辑:它总是在这条线上中断(在视图中):

@Html.Action("UnreadEmails", "Message")

它永远不会进入代码背后..

在克里斯对另一篇文章提出建议后,我在方法顶部添加了[AllowAnonymous]

[AllowAnonymous]
public PartialViewResult UnReadEmails()
{
   if (User.Id != null)
   {
      List<Emails> resultList = EmailController.GetUnreadEmailsByUserId(User.Id);
       return PartialView("~/Views/Emails/_UnReadEmails.cshtml", resultList);
   }
   return PartialView("Error, not found!");
}

编辑编辑编辑:

有趣的事实是,无论我在 Controller 的方法中写了什么,即使我注释了所有代码,它仍然会在 View 上中断,这意味着它永远不会进入 Controller 的方法。我在 UnReadEmails 方法的开头放置了断点,它从未被击中,它总是在视图上中断!

在 MAURIZIO 建议后编辑以将其更改为 @Html.RenderPartial 比我收到以下问题:

未找到部分视图“UnReadEmails”或没有视图引擎 支持搜索的位置。以下位置是 搜索:~/Views/Dashboard/UnReadEmails.aspx ~/Views/Dashboard/UnReadEmails.ascx ~/Views/Shared/UnReadEmails.aspx ~/Views/Shared/UnReadEmails.ascx ~/Views/Dashboard/UnReadEmails.cshtml ~/Views/Dashboard/UnReadEmails.vbhtml ~/Views/Shared/UnReadEmails.cshtml ~/Views/Shared/UnReadEmails.vbhtml

编辑:

编译器错误消息:CS0120:非静态字段、方法或属性“MessageController.UnReadEmails()”需要对象引用

我尝试将 UnReadEmails() 设为静态,但收到以下错误:

错误 1 ​​非静态字段需要对象引用, 方法或属性 'System.Web.Mvc.Controller.PartialView(string, 对象)' ...Controllers\Message\MessageController.cs

【问题讨论】:

  • 你试过使用@Html.RenderPartial("UnreadEmails", "Message") 吗?
  • 那个参数“Message”是干什么用的?是 RenderPartial 方法的参数之一显示的错误(void ->object)吗?
  • @MauricioGraciaGutierrez 检查编辑我的朋友,我用 { } 大括号解决了 void-> 对象问题。但是我应用 RenderPartial 后还有一个问题
  • 你的控制器叫什么名字?
  • @RMadd 控制器的名字是MessageController

标签: c# asp.net asp.net-mvc razor asp.net-mvc-5


【解决方案1】:

由于您的部分视图不在共享文件夹中,您需要提供完整路径

{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml")}

由于该视图需要电子邮件列表,因此您需要将其添加为参数

{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",EmailController.GetUnreadEmailsByUserId(User.Id))}

最好的方法是在模型中创建一个属性 (List&lt;Emails&gt; lstUnreadEmails) 并在MessageController 的方法中加载该电子邮件列表,以便信息准备好使用该指令呈现部分:

{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",Model.lstUnreadEmails)}

如果您没有“主模型”,您可以将其存储在 ViewBag 中,从 MessageController 方法调用它

ViewBag.lstUnreadEmail‌s = E‌​mailController.Get‌‌​​Un‌​readEmailsByUserId(U‌​ser.Id);

在视图中使用这个

{@Html.RenderPartial("~/Views/Emails/_UnReadEmails.cshtml",ViewBag.lstUnreadEmail‌​s)}

【讨论】:

  • 你能检查我的编辑吗?
  • 还要检查我答案的最后一部分,因为从视图调用控制器方法不是一个好习惯。
  • @Roxy'Pro 不要将我建议的新属性 (lstUnreadEmails) 与您似乎正在使用的方法 UnreadEmails 混淆
  • 这种方法似乎是一个很好的方法,因为当我用一个空列表测试它时没有错误,但我认为我不能这样做:Model.lstUnreadEmails 因为这个 PartialView 中没有模型我正在尝试加载我的部分视图...所以我想知道如何根据您的第二个建议将列表发送到我的部分视图,其中方法需要是静态的,我收到了我在编辑中解释的错误我的问题。
  • 尝试将视图重新定位到 "~/Views/Shared/" 并使用 "_UnReadEmails" 作为 RenderPartial 的第一个参数(同时考虑从部分名称和第一个参数中删除初始下划线)
猜你喜欢
  • 2017-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多