#asp.net-mvc #asp.net-mvc-4 #razor
#asp.net-mvc #asp.net-mvc-4 #бритва
Вопрос:
У меня есть две модели, сообщения и комментарии. Post PK — это внешний ключ в комментариях (один ко многим). Тогда у меня есть ViewModel с сообщениями и комментариями.
Это мой контроллер
public ActionResult Index()
{
var model = db.Comments.Include(p => p.Post)
.OrderByDescending(p => p.CommentId).ToList()
.Select(p => new ListCommentsViewModel
{
Comment = p.PostComment,
Message = p.Post.Message
}).ToList();
return View(model);
}
Позже я буду фильтровать значение внешнего ключа, поэтому значение внешнего ключа всегда будет одинаковым. Как я могу отобразить его один раз в представлении. Это работает
@model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.Message)
@Html.DisplayFor(modelItem => item.Comment)
}
Но я хочу использовать @Html.DisplayFor(modelItem => item.Message)
внешний foreach смысл, значение сообщения внешнего ключа всегда будет одинаковым.
Обновить
Это сообщения и комментарии моих моделей
public class Post
{
public Post()
{
Vote = new HashSet<Vote>();
Comment = new HashSet<Comment>();
}
public int PostId { get; set; }
public string Message { get; set; }
public DateTime MessageDate { get; set; }
public virtual ApplicationUser User { get; set; }
public virtual ICollection<Vote> Vote { get; set; }
public ICollection<Comment> Comment { get; set; }
}
public class Comment
{
public Comment() { }
public int CommentId { get; set; }
public string PostComment { get; set; }
public DateTime CommentDate { get; set; }
public int PostRefId { get; set; }
[ForeignKey("PostRefId")]
public virtual Post Post { get; set; }
}
Обновление 2
С моим кодом я получаю этот результат в представлении
post 1
Comment 1
post 1
Comment 2
post 1
Comment 3
Я хочу получить этот результат (смысл сообщения тот же FK)
post 1
Comment 1
Comment 2
Comment 3
Комментарии:
1. Что такое имя поля post table pk?
2. PK в сообщениях — postID -> public int postID { получить; установить; }
Ответ №1:
Попробуйте присоединиться в запросе linq
var model = (from p in db.Post
join c in db.Comments on p.PostId equals c.PostId
select new { p.Post, c.PostComment})
.OrderByDescending(p => p.CommentId);
На странице просмотра
@model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>
string post="";
@foreach (var item in Model)
{
if(post!=item.Post)
{
@Html.DisplayFor(modelItem => item.Post)
}
@Html.DisplayFor(modelItem => item.PostComment)
post=item.Post;
}
или
var model = (from p in db.Post
join c in db.Comments on p.PostId equals c.PostId into g
select new { p.Post,
comments = g.Select(x =>x.PostComment)}).AsEnumerable()
.Select(x => new {x.Post,comments = String.Join(",",x.PostComment)})
.OrderByDescending(p => p.CommentId);
На странице просмотра
@model IEnumerable<FreePost.Viewmodels.ListCommentsViewModel>
@foreach (var item in Model)
{
@Html.DisplayFor(modelItem => item.Post)
@Html.DisplayFor(modelItem => item.comments ) //All comments display in single line with splited by ",".If you want different line using split function to split the string
}
Комментарии:
1. При этом сообщение «@Html.DisplayFor (ModelItem => item.Post)» будет отображаться в представлении только один раз? Я вижу, что у вас все еще есть элемент. Опубликовать в начале.