Hellcat8
Hellcat8

Reputation: 568

C# ASP.NET MVC 5 - Type 'System.Web.Mvc.MvcHtmlString' is not enumerable

Here is the context :
This is my first ASP.NET MVC web application.
On the categories list, I click on a category to see all infos about it in a new view. From this view, I display its name, its description and the number of products in this category. Below that, I want to display all products in this category. I gave a try to the Html.Action() method. But when I want to iterate through the foreach statement, Visual Studio tells me that Type 'System.Web.Mvc.MvcHtmlString' is not enumerable.

Here is my view (details about a category):

@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)
{

}

Here is my GetListOfProductsByCategory() method from the ProductController :

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

I still continue to find a solution with IEnumerable casting or something.

Thanks,

Hellcat.

Upvotes: 1

Views: 632

Answers (2)

Nick Mehrdad Babaki
Nick Mehrdad Babaki

Reputation: 12545

The result of @Html.Action is a View. When you have an action inside a controller, this action usually return a view, and that rendered view is result of Html.Action ,for displaying it you need to use an @ before html. You should write your code as below:

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

Then right click on View and from menu select Add View, then create a partial view. inside partial view you can enumerate your list and create the rendered out put. Finally wherever you want to show the rendered list, just call:

@Html.Action("GetListOfProductsByCategory",id)

When creating view, you need to select your model and view type as list so on top of your view you would have:

@model IEnumerable<product>

Then you must use you foreach as below:

@foreach (var item in Model)
{

}

Upvotes: 1

Hellcat8
Hellcat8

Reputation: 568

Okay I modified my Partial View (GetListOfProductsByCategory) like that :

@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>
}

And in my Category Details View I display the products like this :

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

It's now okay hanks to Mehrdad Babaki's answer.

Upvotes: 0

Related Questions