"IEnumerable<>"没有包含“”的定义,并且找不到接受类型为“IEnumerable<>”的第一个参数的扩展方法“”。

4

我希望创建一个类似下图的在线论坛:


enter image description here


这是我的控制器方法:

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);
}

模型类

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

}

查看页面

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

当我调试上述应用程序时,我收到以下错误消息: “IEnumerable”不包含“Discussion_Title”的定义,也找不到接受类型为“IEnumerable”的第一个参数的扩展方法“Discussion_Title”(是否缺少使用指令或程序集引用?)

你的 DisplayFor() 辅助方法需要在 foreach 循环内部。但我最好的猜测是,你真正想做的是显示一个 DiscussionPreview_Model 和与之关联的所有评论集合? - user3559349
但是我只有一个讨论标题和讨论描述。 - Chathz
1
不是的,你有一个集合(IEnumerable就代表这个含义)。 - user3559349
2
然后您需要重新设计您的模型。您想要包含TitleDescription等属性,以及IEnumerable<Comment> Comments,其中Comment包含CreateByDescription等属性。 - user3559349
你不能使用DotNetFiddle引用你的数据库上下文 :) 你只需要修改查询,以便获取与Discussion_ID匹配的第一个“AB_Discussion”,并填充模型的主要属性,然后获取所有相关的评论来填充“Comments”集合。停止那个可怕的命名 - 只是ID而不是Disussion_ID :) - user3559349
显示剩余7条评论
2个回答

4

您的模型类型为IEnumerable<prjct.Models.DiscussionPreview_Model>,您正在试图像prjct.Models.DiscussionPreview_Model一样使用它,这是不可行的。您需要循环遍历 IEnumerable,并且对于IEnumerable中的每个元素使用 Html.DisplayFor,就像在评论部分所做的那样。


将 '@model IEnumerable<prjct.Models.DiscussionPreview_Model>' 重命名为 '@model prjct.Models.DiscussionPreview_Model'。 - mggluscevic

1

你正在尝试使用as关键字

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

但是在这里,您的模型是IEnumerable,因此您有两个选项。

选项1

如果您确定Discussion_Title、Discussion_Description和Discussion_CreateDate对于所有记录都相同,则必须使用以下方式:

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

对于其他两列也是同样的情况,但在这种情况下至少必须有一条记录,否则在使用之前必须检查记录计数。

选项2

尝试以以下方式创建模型

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; }
    .....
}

并在视图中以相同的方式使用它。

如果需要更多详细信息,请告诉我。


谢谢。我尝试了你提供的两个选项,似乎都不起作用。 - Chathz
'IEnumerable<DiscussionPreview_Model>' does not contain a definition for 'Discussion_Title' and no extension method 'Discussion_Title' accepting a first argument of type 'IEnumerable<DiscussionPreview_Model>' could be found (are you missing a using directive or an assembly reference?) - Chathz
请将类与完整路径放置在 (IEnumerable<DiscussionPreview_Model>)--> IEnumerable<<your class namespace>.DiscussionPreview_Model> 中。如果您仍然遇到任何问题,请告诉我。 - Ravi
那就是它现有的状态,带有完整路径 :(( - Chathz
对我来说,@Html.DisplayFor(m=>m.ElementAt<prjct.Models.DiscussionPreview_Model>(0).Discussion_Title)是有效的。 - Ravi
@Ravi,我也遇到了同样的错误,请帮我解决一下。我需要将其显示为页面的主标题,并在下面显示详细信息。这是我的问题链接:https://stackoverflow.com/questions/62012068/cs1061-ienumerableorders-tables-does-not-contain-a-definition-for-labviewr,但我不需要循环它,我只需要获取一个值。 - Abdullah

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接