【问题标题】:How to create server method, that populates collection and returns partial view, in ASP.NET MVC?如何在 ASP.NET MVC 中创建填充集合并返回部分视图的服务器方法?
【发布时间】:2017-10-13 18:07:49
【问题描述】:

我试图在我的 _Layout.cshtml 文件中调用 IEnumerable 方法。最后我被建议“使用 html.action - 调用填充集合并返回部分视图的服务器方法”。

目前我已经创建了部分文件 _Dodatki.cshtml,其中包含 IEnumerable 方法的调用(Aktualnosci.cs 是模型文件):

@model IEnumerable<DluzynaSzkola.Models.Aktualnosci>

在我的 _Layout.cshtml 中,我从构造函数中调用了方法:

@Html.Action("_Dodatki", "AktualnosciController ", new {area="" })

最后我想在我的 AktualnosciConstructor.cs 文件中创建方法。目前我有方法:

[ChildActionOnly]
[ActionName("_Dodatki")]
public ActionResult Dodatki()
{
    IList<Aktualnosci> lista = new IList<Aktualnosci>();
    return PartialView("_Dodatki", lista);
}

不幸的是,当使用上述语法时,它在编译器中给了我消息:

"无法创建抽象类或接口的实例 'IList'”。

将“IList”替换为“List”时,出现异常:

“System.Web.HttpException:找不到路径'/'的控制器 或不实现 IController。”

我不知道如何以其他方式在方法中填充集合。

编辑:根据要求,在 AktualnosciController.cs 定义下,没有其他方法:

namespace DluzynaSzkola.Controllers
{
    public class AktualnosciController : Controller
    {
        //here are other methods

        [ChildActionOnly]
        [ActionName("_Dodatki")]
        public ActionResult Dodatki()
        {
            IList<Aktualnosci> lista = new IList<Aktualnosci>();
            return PartialView("_Dodatki", lista);
        }
    }
}

【问题讨论】:

  • 你能告诉我们整个控制器吗?也许排除其他方法,但至少是控制器定义。
  • 什么时候收到"System.Web.HttpException: The controller for path '/' was not found or does not implement IController." 异常?当你点击链接时?
  • @Wndrr 我在开始编译应用程序时得到它(在主页上布局)。
  • 这可能是原因但不确定...在您的视图中您有@Html.Action("_Dodatki", "_Layout")... 这意味着您正在寻找_Dodatki 控制器中的_Dodatki 操作...您没有_Layout 控制器……你有Aktualnosci 控制器……所以尝试更改为@Html.Action("_Dodatki", "Aktualnosci")

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


【解决方案1】:

GTown-Coder 注意到您的控制器名称似乎错误。相应地更新了我的答案。

我认为您的问题可能与this SO post 回答的问题相同。

尝试指定区域名称,如果此控制器不在区域中,只需添加一个空区域名称。

@Html.Action("_Dodatki", "AktualnosciController ", new {area="" })

即使这不能解决您的问题,这也是一种很好的做法,因为如果稍后在某个区域内使用此视图,它将尝试在该区域而不是根空间中查找控制器。

【讨论】:

  • 您一发布就更新我的答案。我没有足够注意人们给事物起的名字......这不是我第一次错过像这样明显的不匹配 -_- 谢谢你的敏锐眼光:-)
  • 现在,只需将_ 从控制器名称中取出即可。 OP也没有这个
  • 哈哈没问题。
  • @GTown-Coder 好点,伙计们,刚刚更正了。但是当使用“列表”时,它给了我同样的异常 System.Web.HttpException: The controller for path '/' was not found or does not implement IController in标记行:@Html.Action ("_Dodatki", "AktualnosciController", new { area = "" })。我猜,它应该是 IEnumerable 模型的接口列表。但是 IList 在与上述相同的上下文中不起作用。
【解决方案2】:

好的,我已经对我的项目进行了更改,效果很好。

我在 _Layout.cshtml 中的调用有所改变。 AktualnosciController 应该被称为 Aktualnosci !!!

<div class="kontenerDodatkiLayout hidden-xs hidden-sm">
                <div class="archiwum">Archiwum</div>
                @Html.Action("_Dodatki", "Aktualnosci", new { area = "" })
            </div>

我的局部视图 _Dodatki.cshtml 模型调用有点改变:

@model IEnumerable<DateTime>

<div class="wpisDodatki">
    @foreach (var item in Model)
    {
        <div> @Html.DisplayFor(modelItem => item)</div>
    }
    <p>test<br />test<br />test</p>
</div>

我的控制器 AktualnosciController.cs 中的方法如下所示:

//[ChildActionOnly]
        [ActionName("_Dodatki")]
        public ActionResult Dodatki()
        {
            using (var context = new DluzynaContext())
            {
                var lista = context.Indeks.Select(it => it.Dzien).ToList();

                return PartialView("_Dodatki", lista);
            }
        }

在这里,lista 被传递给我的局部视图 _Dodatki,并填充了上下文属性 Indeks 和模型属性 Dzien。 p>

感谢各位@Wndrr 和@GTown-Coder 的帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多