【问题标题】:Using list in a model value in LINQ query在 LINQ 查询中的模型值中使用列表
【发布时间】:2014-02-26 19:47:35
【问题描述】:

我处于 asp.net MVC 开发的非常基本的阶段。所以有时我很难用简单的 LINQ 查询来工作。

场景-

我有一个页面,其中包含一些 Image 并由用户评论该图像(就像 facebook 上包含来自用户的 cmets 的帖子一样)。

所以我从 textarea 中保存这些 cmets 并通过 Ajax 查询发送图像 ID。

这是我的控制器操作方法-

保存评论-

   [HttpPost]
        public void SaveComment(CardModel card) {
            CardCommentTable commenttable = new CardCommentTable();
            commenttable.CardComment = card.cardComment;
            commenttable.FKcardID = card.cardID;
            db.CardCommentTables.InsertOnSubmit(commenttable);
            db.SubmitChanges();
        }

此评论保存在CardCommentTable 中,该图像中的表具有外键引用。

在视图页面上渲染图像和其他字段-

此查询呈现图像和其他使其成为图像帖子的字段。比如titledateofsubmitLike等。

public ActionResult CardDetails(CardModel card) {

            var cardDetail = (from u in db.CardTables
                              where u.CardID == card.cardID
                              select new CardModel {
                                  cardID = u.CardID,
                                  cardHashCode = u.CardHashCode,
                                  cardDate = u.CardDate,
                                  cardFileName = u.CardFileName,
                                  cardFilePath = u.CardFilePath,
                                  cardTitle = u.CardTitle
                              }).ToList();
            return View(cardDetail);

        }

现在在cardTable 我还有一个名为cardComment 的列,我想显示表CardCommentTable 中所有保存的cmets。

所以我尝试了-

public ActionResult CardDetails(CardModel card) {
        var allsavedcomments= (from u in db.CardCommentTables
                           where u.FKcardID == card.cardID
                           select u).ToList();

        var cardDetail = (from u in db.CardTables
                          where u.CardID == card.cardID
                          select new CardModel {
                              cardID = u.CardID,
                              cardHashCode = u.CardHashCode,
                              cardDate = u.CardDate,
                              cardFileName = u.CardFileName,
                              cardFilePath = u.CardFilePath,
                              cardTitle = u.CardTitle,
                              cardComment = allsavedcomments // Trying to render all saved coments here.
                          }).ToList();
        return View(cardDetail);

    }

查看-

@model IEnumerable<FunRanger.Models.CardModel>

@foreach (var item in Model) {
    <script type="text/javascript">
        $(function () {
            $('#save-comment').click(function () {
                var textareavalue = $('#textarea-comment').val();
                $.ajax({
                    url: '/Home/SaveComment/',
                    type: 'post',
                    data: '&cardComment=' + textareavalue + '&cardID=' + '@item.cardID',
                    success: function (data) {
                        $('#all-comments').append(data);


                    }

                });

            });

        });
    </script>
    using (Html.BeginForm()) {
    @Html.ValidationSummary(true)


        @if (Model != null) {


                <h2 class="header-wrapmain">
                    @item.cardTitle
                </h2>

                    @item.cardDate.ToShortDateString()


                        <img src="@item.cardFilePath" />

                                <a href="#" class="@item.cardHashCode" rel="tooltip" data-placement="bottom" title="Filter by @item.cardHashCode">
                                    #@item.cardHashCode</a>



        }
        else {
            <div class="alert alert-danger">
                No More items to preview
            </div>
        }


    }

    <textarea class="span12" rows="5" id="textarea-comment" style="resize: none" placeholder="Enter a comment..."></textarea>

        <a href="javascript:;" id="save-comment" class="btn-primary btn">Save comment</a>

        <ol>
            <li>
                @item.cardComment
            </li>
        </ol>

}

如何在此处插入 List 结果列中。

如何使用上述查询显示所有已保存的 cmets?

感谢您的帮助。

【问题讨论】:

  • 您是在谈论在您的视图中显示 cmets 吗?如果是这样,请也添加视图。
  • 您遇到错误了吗?它是什么,在哪里? cardComment 将是您声明的任何类型。那是什么类型的?
  • @AndreiV,请参阅编辑。
  • @simonatrcl- 是的,错误是Error 16 Cannot implicitly convert type 'System.Collections.Generic.List&lt;FunRanger.Models.CardCommentTable&gt;' to 'string'
  • @user3163213,该错误告诉您您正在尝试一次显示所有 cmets,就好像它在单个 string 对象中一样。

标签: c# asp.net sql asp.net-mvc linq


【解决方案1】:

我用外键关系船稍微更新了你的代码。这将使您免于对数据库使用两个不同的查询(就像您现在正在做的那样)。

所以如果你的数据库模型看起来像这样 -

那么你应该以这种方式在你的代码中拥有一个视图模型 -

public class ImageViewModel
{
    public string ImageId { get; set; }
    public string ImageUrl { get; set; }
    public List<string> Comments { get; set; }
}

您的控制器操作将返回所有结果应该是这样的 -

 public class ListController : Controller
    {
        public ActionResult Index()
        {
            ImageViewModel model;
            using (SampleEntities entities = new SampleEntities())
            {
                model = (from p in entities.Images
                                     where p.ImageId == "1"
                                     select new ImageViewModel()
                                     {
                                         ImageId = p.ImageId,
                                         ImageUrl = p.ImageUrl,
                                         Comments = p.ImageComments.Select(pa => pa.Comment).ToList()
                                     }).FirstOrDefault();
            }

            return View(model);
        }
    }

最后是显示所有图像结果的视图 -

@model MVC.Controllers.ImageViewModel

@{
    ViewBag.Title = "Index";
}

<h2>Index</h2>

<div>
    <h4>ImageViewModel</h4>
    <hr />
    <dl class="dl-horizontal">
        <dt>
            @Html.DisplayNameFor(model => model.ImageId)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.ImageId)
        </dd>

        <dt>
            @Html.DisplayNameFor(model => model.ImageUrl)
        </dt>

        <dd>
            @Html.DisplayFor(model => model.ImageUrl)
        </dd>
        <br/>
        @foreach (var item in Model.Comments)
        {
            @item <br/>
        }

    </dl>
</div>

输出将是 -

【讨论】:

    【解决方案2】:

    您的cardComment 属性是一个字符串列表;它需要迭代才能显示。替换:

    <ol>
        <li>
            @item.cardComment
        </li>
    </ol>
    

    与:

    <ol>
    @foreach (var singleComment in Model.cardComment)
    {
       <li>@singleComment </li>
    } 
    </ol>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-17
      • 2011-03-28
      • 1970-01-01
      • 2020-07-29
      相关资源
      最近更新 更多