Chathz
Chathz

Reputation: 743

'IEnumerable<>' does not contain a definition for '' and no extension method '' accepting a first argument of type 'IEnumerable<>' could be found

I want to create online forum like below image


enter image description here


this is my Controller method

public ActionResult Discussion_Preview()
{

    int Discussion_ID = 1;


   var discussion_preview = (from d in db.AB_Discussion
                              where d.Discussion_ID == Discussion_ID
                              join dc in db.AB_DiscussionComments on d.Discussion_ID equals dc.Discussion_ID
                              join user_discussion in db.AspNetUsers on d.CreatedBy equals user_discussion.Id
                              join user_comments in db.AspNetUsers on dc.CreatedBy equals user_comments.Id
                              select new DiscussionPreview_Model
                              {
                                Disussion_ID = d.Discussion_ID,
                                Discussion_CreateDate = d.CreatedDate,
                                Discussion_CreateBy = user_discussion.UserName,
                                Discussion_Title = d.Discussion_Name,
                                Discussion_Description = d.Discription,
                                Comment_ID = dc.Comment_ID,
                                Comment_Description = dc.Comment_Discription,
                                Comment_CreateDate = dc.CreatedDate,
                                Comment_CreateBy = user_comments.UserName

                              });



    return View(discussion_preview);
}

Model Class

public class DiscussionPreview_Model
{
    public int Disussion_ID { get; set; }
    public Nullable<System.DateTime> Discussion_CreateDate { get; set; }
    public string Discussion_CreateBy { get; set; }
    public string Discussion_Title { get; set; }
    public string Discussion_Description { get; set; }

    public int Comment_ID { get; set; }
    public Nullable<System.DateTime> Comment_CreateDate { get; set; }
    public string Comment_CreateBy { get; set; }
    public string Comment_Description { get; set; }

}

View Page

@model IEnumerable<prjct.Models.DiscussionPreview_Model>

@{
    ViewBag.Title = "Discussion_Preview";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

 <h3>@Html.DisplayFor(model => model.Discussion_Title)</h3>

<div>@Html.DisplayFor(model => model.Discussion_Description)</div>
<div>@Html.DisplayFor(model => model.Discussion_CreateDate)  @Html.DisplayFor(model => model.Discussion_CreateDate)</div>

@foreach (var item in Model)
{

    <fieldset>
        <legend></legend>

        <h4>Comments</h4>
        <div class="display-field">@item.Comment_Description</div>
        <div class="display-field">@item.Comment_CreateBy : @item.Comment_CreateDate </div>

    </fieldset>
}

When debug above application I'm getting below error message

'IEnumerable' does not contain a definition for 'Discussion_Title' and no extension method 'Discussion_Title' accepting a first argument of type 'IEnumerable' could be found (are you missing a using directive or an assembly reference?)

Upvotes: 4

Views: 29870

Answers (2)

Ravi
Ravi

Reputation: 475

You are trying to use as

<h3>@Html.DisplayFor(model => model.Discussion_Title)</h3>

but here your model is IEnumerable, so you are having two options.

Option 1

If you are sure that Discussion_Title, Discussion_Description, and Discussion_CreateDate is same for all record then you have to use as

<h3>@Html.DisplayFor(model => model.ElementAt<DiscussionPreview_Model>(0).Discussion_Title)</h3>

and same for other 2 column, but in this case at least one record must be there otherwise you have to check for count of record before using it.

Option 2

Try to create the model in such a way that like

public class Discssion
{
    public string Discussion_Title { get; set; }
    public string Discussion_Description { get; set; }
    public string Comment_CreateBy { get; set; }
    public List<DiscussionPreview> DiscussionPreviews{ get;set;}
}

public class DiscussionPreview
{
    public class Comment_Description{ get; set; }
    .....
}

and use it in same way in your view.

Let me know you need more details.

Upvotes: 1

Sami Kuhmonen
Sami Kuhmonen

Reputation: 31203

Your model is of type IEnumerable<prjct.Models.DiscussionPreview_Model> and you're trying to use it like prjct.Models.DiscussionPreview_Model, which doesn't work. You will have to loop the IEnumerable and then use the Html.DisplayFor for each of the elements inside the IEnumerable, like you're doing in the comments part.

Upvotes: 4

Related Questions