PDA

View Full Version : نمایش نظرهای پست...



alireza_rashvand
جمعه 27 تیر 1393, 17:11 عصر
با سلام
برای نمایش نظرهای یک پست, از ViewModel استفاده کردم:


public class PostCommentsViewModel
{
private int? Id;
public Post Post { get; set; }
public List<Comment> Comments { get; set; }
public PostCommentsViewModel(int? Id)
{
var db = new Context();
Post = db.Posts.First(x => x.Id == Id);
var query = from x in db.Comments where x.PostId == Id select x;
Comments = query.ToList();
}
}


برای نمایش ان هم در کنترلر مربوط :


public ActionResult Show(int? Id)
{
var viewModel = new PostCommentsViewModel(Id);
return View(viewModel);
}


کلاس پست:

public class Post
{
[Key]
public int Id { get; set; }
[DisplayName("عنوان خبر :")]
public String Title { get; set; }
[AllowHtml]
[DisplayName("متن خبر :")]
public String Content { get; set; }
public DateTime DateCreated{ get; set; }
public Boolean Show { get; set; }
public int UserId { get; set; }
public virtual ICollection<Comment> Comments { get; set; }
}

کاربر رو به ان اضافه نکردم برای همین فعلا به صورت دستی UserId ثبت می کنم.

کلاس نظر:

public class Comment
{
public int Id { get; set; }
public String Name { get; set; }
public String Content { get; set; }
public DateTime DateCreated { get; set; }
[ForeignKey("PostId")]
public virtual Post Post { get; set; }
public int PostId { set; get; }
}


ولی متاسفانه خطای زیر را می دهد.

The model item passed into the dictionary is of type 'Projects.ViewModels.PostCommentsViewModel', but this dictionary requires a model item of type 'Projects.Models.Post'.


ایا کد یا روشم اشتباه است؟ دوستان چه پی شنهادی دارند؟

ebiramgs
شنبه 28 تیر 1393, 04:47 صبح
سلام

مدل پست هاتون مشکلی نداره ولی مدل نظرات رو به این صورت تغییر بدید:


public class Comment

{
public int Id { get; set; }
public String Name { get; set; }
public String Content { get; set; }
public DateTime DateCreated { get; set; }

public int PostId { set; get; }
}




بعد در view مربوط به پست ها کافیه با یک patialview کامنت ها رو فراخوانی کنید:

@foreach (var item in Model.Comments)
{
@Html.Partial("_ShowComment", item)
}

محتوی پارشال "_ShowComment" هم مقادیری هست که میخواید از مدل نظرات خونده بشه،تو این روش به ViewModel و اکشن PostCommentsViewModel و show هم نیاز نیست.

alireza_rashvand
شنبه 28 تیر 1393, 19:14 عصر
سپاس از جوابتان ولی هدف نمایش همزمان یک خبر همراه با نظراتش است برای این کار بدون ViewModel فکر نکنم امکان داشته باشه !
ان دو خطی که شما فرمودید حذف کنم هم برای EF Code First نوشتم که کلید خارجی و داخلی رو تشخیص بده .

hakim22
شنبه 28 تیر 1393, 21:34 عصر
شما پست رو نمایش بدید . در قسمت نظرات از Html.Action استفاده کنید.یک اکشن در سرور طراحی کنید که Id پست رو بگیره و نظرات آن پست را به PartialView بفرستند.

alireza_rashvand
یک شنبه 29 تیر 1393, 15:40 عصر
سپاس از شما,


شما پست رو نمایش بدید . در قسمت نظرات از Html.Action استفاده کنید.یک اکشن در سرور طراحی کنید که Id پست رو بگیره و نظرات آن پست را به PartialView بفرستند.

این چیزی که شما فرمودید به نظرم نمایش نظرات با زدن بر روی لینکه
ولی منظورم نمایش پست همراه با همه نظرات داده شده است.
مثلا http://www.dotnettips.info/post/1844 این صفحه رو د رنظر بگیرید, متن نمایش داده شده نظرات هم در انتهای لیست شده.

alireza_rashvand
دوشنبه 30 تیر 1393, 15:54 عصر
یافتم :)
جواب رو می نویسم تا اگر دیگران هم نیاز داشتن استفاده کنند:
نکتی اصلی در اکشن و View است.
اکشن:


public ActionResult Show(int? Id)
{
var post = db.Posts.Find(Id);
var viewModel = new PostCommentsViewModel(Id)
{
Post = post
};

return View(viewModel);
}


view:


@model Projects.ViewModels.PostCommentsViewModel
//post
@Html.ShowPost(@Model.Post.Content, @Model.Post.Title, @Model.Post.UserId, @Model.Post.Id, @Model.Post.DateCreated)

//comment
@foreach (var item in Model.Comments)
{
@Html.ShowComment(item.Content, item.Name, item.DateCreated)
}

hakim22
چهارشنبه 01 مرداد 1393, 01:08 صبح
سپاس از شما,



این چیزی که شما فرمودید به نظرم نمایش نظرات با زدن بر روی لینکه
ولی منظورم نمایش پست همراه با همه نظرات داده شده است.
مثلا http://www.dotnettips.info/post/1844 این صفحه رو د رنظر بگیرید, متن نمایش داده شده نظرات هم در انتهای لیست شده.

Action با ActionLink فرق داره و مستقیما و بدون کلیک خروجی یک اکشن را نمایش میدهد.

alireza_rashvand
پنج شنبه 02 مرداد 1393, 14:00 عصر
Action با ActionLink فرق داره و مستقیما و بدون کلیک خروجی یک اکشن را نمایش میدهد.

لطفا, یک نمونه (لینک) بدید, ببینم...
سپاس.