繁体   English   中英

ASP.NET MVC无法将数据和相关数据发送到视图。 (查看模型模式?)

[英]ASP.NET MVC Trouble getting data and related data to the view. (View Model Pattern?)

我的网站有用户。 我的网站上有商品。 用户可以对商品进行评论。 用户可以留下项目的等级。 当用户对项目进行评分时,他们会在不同类别中对其进行评分:建筑质量评分,实用性评分,美学吸引力评分。

因此,在我的数据库中,“我的评论”表将有一个条目,而“我的评分”表将为每个用户每个项目三个条目。

现在,在我的项目页面上,我想显示十个最新的评论和评分。

如何获取评论和相应的评分并将其全部发送到视图以进行显示?

(我正在使用LINQ to SQL)。

谢谢。

编辑:对不起,以为我已经包含了足够的信息。 这是有关我的数据库的更多信息。 假设我的网站上有不同种类的物品。 假设其中包含有关汽车和书籍的信息。 显然,对汽车进行评级时,与对书进行评级时,您具有不同的标准。

我正在将所有评分数据放入一个“评分”表中。

我有一个RatingsCategories表。 它包含两个列:

RatingCategoryID  (Identity column)
RatingCategory    (name of category)

“封面艺术”类别适用于图书。 “性能”类别适用于汽车。

我有一个评分表。 它包含以下列:

RatingID  (Identity column)
EntityID  (Unique identifier among Cars AND Books)
UserID    (Identifier of the user who left the rating)
RatingCategoryID  (Reference to the category; FK from the RatingsCategories table)
Rating    (int;  the rating given)
DateModified (DateTime)

因此,该表可以包含所有书籍和汽车的评级。 一本书可能对每个用户有三种不同的评级(封面艺术,内容,装订质量等),而一部汽车可能对每个用户具有三种不同的评级(外观,性能,易于维护等)

同样,我的“评论”表可以包含“书籍和汽车”的评论。 看起来像这样:

ReviewID  (Identity column)
EntityID  (Unique identifier among Cars AND Books)
UserID    (Identifier of the user who left the rating)
Body      (Text of review)
DateModified  (DateTime)

用户可以对每个项目进行一次评分和评论。 因此,如果网站访问者导航到“图书”页面,我想显示最近的10条评论和相应的评分。 这意味着我需要获取该书的10条最新评论记录。 我还需要获取该书的十个最近的完整评级(与评论相同的EntityID和相同的UserID),每个评级可能是三个记录。

那有意义吗?

最好的方法是什么?

我对这种方法和数据库模式感到疯狂吗?

谢谢你的耐心。

这里没有什么要继续的事,但是我会做一些假设并尝试回答您的问题。

假设:

  1. 如果您使用的是LINQ to SQL,则可能使用的是存储库模式。
  2. 您正在使用一个关系数据库结构,该结构将涉及将表与评论关联和项目与评级关联的表。
  3. 我有点猜测您的数据库结构是什么。

我将向后努力以帮助您进行设置。 将要显示评论和评分的主顶级视图必须严格键入一个包含另一个用于评论和评分的视图模型的视图模型。 您的视图可能包含对部分视图的引用,因为该视图将易于重用。

<div class="latest-reviews-ratings">
    <% Html.RenderPartial("ReviewsAndRatings", Model.Reviews); %>
</div>

然后您的子对象可以看起来,但是您希望它看起来...

<div class="reviews">
    <% foreach (var reviewModel in Model) {%>
        <div class="review">
            Review of: <i><%: reviewModel.Item.Name %></i> by <b><%: reviewModel.Reviewer.Username %></b>.
            <div><%: reviewModel.Review.Value %></div>

            <ul class="ratings">
                <% foreach (var ratingModel in reviewModel.Ratings) {%>
                    <li>
                        <b><%: ratingModel.Rater.Username %></b> rated this a <%: ratingModel.Rating.Value %> on <%: ratingModel.Rating.CategoryName %>.
                    </li>
                <% } %>
            </ul>
        </div>
    <% } %>
</div>

您的视图模型可能如下所示:

public class IndexViewModel
{
    public IEnumerable<ReviewViewModel> Reviews { get; set; }
}

ReviewViewModel可能看起来像这样:

public class ReviewViewModel
{
    public User Reviewer { get; set; }
    public Item Item { get; set; }
    public Review Review { get; set; }
    public IEnumerable<RatingViewModel> Ratings;
}

RatingViewModel:

public class RatingViewModel
{
    public User Rater { get; set; }
    public Rating Rating { get; set; }
}

现在,您要做的就是将其连接到控制器中。 取出您的ItemReview记录并从中创建视图模型。

var itemReviews = _itemReviewRepository.FindAll().OrderByDescending(p => p.Review.DateAdded).Take(10);
var reviewViewModels = itemReviews.Select(p =>
    new ReviewViewModel
    {
        Item = p.Item,
        Reviewer = p.User,
        Review = p.Review,
        Ratings = ReviewRatingService.GetRatingViewModelForReview(p.ReviewId)
    });

您可以根据需要将某些逻辑捕获到存储库或服务类中。 ReviewRatingService类将使用这样的linq查询:(注意:肯定有更好的查询,但这是我很快ReviewRatingService查询)

return (from rating in dataContext.Ratings
        join itemRating in dataContext.ItemRatings
            on rating.Id equals itemRating.RatingId
        join itemReview in dataContext.ItemReviews
            on itemRating.ItemId equals itemReview.ItemId
        join review in dataContext.Reviews
            on itemReview.ReviewId equals review.Id
        where review.Id == reviewId
        select new RatingViewModel
                {
                    Rater = itemRating.User,
                    Rating = rating
                });

现在,您可以使用该数据填充索引视图模型

var model = new IndexViewModel
{
    Reviews = reviewViewModels
};

并将主模型传递回您的视图。

return View(model);

我刚刚编写了Web应用程序。 这实际上很有趣。

没有更多的信息,我想这样的事情会起作用:

Item.Reviews.OrderByDescending(d => d.date).Take(10)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM