【问题标题】:C# ASP.NET MVC 5 - Type 'System.Web.Mvc.MvcHtmlString' is not enumerableC# ASP.NET MVC 5 - 类型“System.Web.Mvc.MvcHtmlString”不可枚举
【发布时间】:2015-10-16 03:54:47
【问题描述】:

这里是上下文:
这是我的第一个 ASP.NET MVC Web 应用程序。
在类别列表上,我单击一个类别以在新视图中查看有关它的所有信息。 从这个视图中,我显示了它的名称、描述和该类别中的产品数量。 在此之下,我想显示该类别中的所有产品。 我尝试了Html.Action() 方法。 但是当我想遍历foreach 语句时,Visual Studio 会告诉我Type 'System.Web.Mvc.MvcHtmlString' is not enumerable

这是我的观点(关于类别的详细信息):

@model UlysseCMS.Models.category

@{
    ViewBag.Title = "Details about "+ Model.category_name + " category";
    var nbProducts = Html.Action("GetNumberOfProductByCategory", "Product", Model.category_id);
    var productsList = Html.Action("GetListOfProductsByCategory", "Product", Model.category_id);
}

<div>
    <span class="leader">
        <span class="mif-chevron-thin-right fg-teal"></span>
        <span>@Html.ActionLink("Categories", "Index")</span> 
        <span class="mif-chevron-thin-right fg-teal"></span>
        <span>@Model.category_name</span>
        <span class="mif-chevron-right fg-teal"></span>
        <span>details</span>
    </span>
</div>
<br />
<hr class="bg-teal" />
<br />

<div class="margin30">
    <div class="flex-grid">
        <div class="row cells7">
            <div class="cell colspan3 offset1 sub-header">
                Category name :
            </div>
            <div class="cell colspan4">
                @Model.category_name
            </div>
        </div> <br/>
        <div class="row cells7">
            <div class="cell colspan3 offset1 sub-header">
                Category description :
            </div> <br/>
            <div class="cell colspan4">
                @Model.category_description
           </div>
        </div> <br/>
        <div class="row cells7">
            <div class="cell colspan3 offset1 sub-header">
                Number of products in this category :
            </div>
            <div class="cell colspan4">
                @nbProducts
            </div>
        </div>
    </div>
</div>

@foreach (var item in productsList)
{

}

这是来自ProductControllerGetListOfProductsByCategory() 方法:

public IEnumerable<product> GetListOfProductsByCategory(int id)
{
    return db.product.Where(x => x.product_category_id == id);
}

我仍然继续通过IEnumerable 强制转换或其他方式找到解决方案。

谢谢,

地狱猫。

【问题讨论】:

  • 您如何在视图中获取 productsList?
  • html.Action 返回 MvcHtmlString
  • 你的动作应该重新运行 ActionResult 我的意思是部分视图

标签: c# asp.net-mvc model-view-controller model ienumerable


【解决方案1】:

@Html.Action 的结果是一个视图。 当你在控制器中有一个动作时,这个动作通常会返回一个视图,并且呈现的视图是 Html.Action 的结果,为了显示它,你需要在 html 之前使用一个 @。 您应该编写如下代码:

public ActionResult GetListOfProductsByCategory(int id)
{
    return View(db.product.Where(x => x.product_category_id == id));
}

然后右键单击视图并从菜单中选择添加视图,然后创建一个局部视图。 在局部视图中,您可以枚举列表并创建渲染输出。 最后,无论您想在哪里显示渲染列表,只需调用:

@Html.Action("GetListOfProductsByCategory",id)

创建视图时,您需要将模型和视图类型选择为列表,以便在您的视图顶部:

@model IEnumerable<product>

那么你必须使用你的foreach如下:

@foreach (var item in Model)
{

}

【讨论】:

  • 感谢您的回答。但是,我的问题没有解决。确实,我不明白您如何从视图(在 CategoryController 中)遍历返回到部分视图(在 ProductController 中)的产品列表?即使进行了这些修改,我仍然会收到相同的错误消息。
【解决方案2】:

好的,我这样修改了部分视图 (GetListOfProductsByCategory):

@model IEnumerable<UlysseCMS.Models.product>

@foreach (var item in Model)
{
    <a href="@Url.Action("Details", new { id = item.product_id })">
        <div class="tile tile-wide bg-white block-shadow margin30" data-role="tile">
            <div class="tile-content slide-up-2">
                <div class="slide fg-darkTeal">
                    <span class="sub-leader" style="padding-left: 5px;">@Html.DisplayFor(modelItem => item.product_name)</span>
                </div>
            </div>
        </div>
    </a>
}

在我的类别详细信息视图中,我会显示这样的产品:

@Html.Action("GetListOfProductsByCategory", "Product", Model.category_id)

感谢 Mehrdad Babaki 的回答,现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多