PDA

View Full Version : درج Comment برای خبر؟



mhd.mirzayi
پنج شنبه 24 مرداد 1392, 13:28 عصر
سلام دوستان عزیز

من در ام وی سی 4 دو تا Entity دارم یکی News و دیگری Commentمی خوام وقتی در صفحه لیست اخبار روی یک خبر کلیک می کنم بیام به صفحه Details و جرئیات خبر رو ببینم و همچنین نظراتی که در باره اون خبر داده شده رو هم ببینم در ضمن بتونم نظر هم بدم حالا مشکل من اینه که نمی دونم چه جوری در View که جزئیات خبر نمایش داده میشه و همچنین لیست نظرات (که تا اینجا مشکلی نیست) چه طوری نظر درج کنم

بهزاد علی محمدزاده
پنج شنبه 24 مرداد 1392, 20:01 عصر
سلام . کلاس نمونه :
public class News
{
public int NewsID { get; set; }
public string Headline { get; set; }
public string MainText { get; set; }

public virtual ICollection<Comment> Comments { get; set; }
}
public class Comment
{
public int CommentID { get; set; }
public string Body { get; set; }
public News News { get; set; }
}
اکشن Details برای نمایش :
public ActionResult Details(int id)
{
var news = _db.News.Find(id);
return View(news);
}

همون اکشن با متد POST به همراه کلاس Comment و کد خبر Id :
[HttpPost]
public ActionResult Details(int id, Comment comment)
{
if (ModelState.IsValid)
{
comment.News = _db.News.Find(id);
_db.Comment.Add(comment);
_db.SaveChanges();
return RedirectToAction("Details",new {Id = id});
}
return Details(id);
}

سمت View :

@model NewsMvc.Models.News

@{
ViewBag.Title = "Details";
}

<h2>Details</h2>

<fieldset>
<legend>News</legend>
<div class="display-field">
@Html.DisplayFor(model => model.Headline)
</div>
<div class="display-field">
@Html.DisplayFor(model => model.MainText)
</div>
</fieldset>
<p>
@Html.ActionLink("Back to List", "Index")
</p>

@foreach (var c in Model.Comments)
{
<ul>
<li>
<p>@c.Body</p>
</li>
</ul>
}

@using (Html.BeginForm())
{
@Html.TextArea("Comment.Body")
<input type="submit" value="Send" />
}

hakim22
جمعه 25 مرداد 1392, 21:59 عصر
همه ی مطالب دوستمون رو درسته اما برای Comment بهتره بجای :

@using (Html.BeginForm())


از Ajax.BeginForm استفاده کنید. تا نظر بدون Refresh شدن صفحه به سرور بره و ذخیره بشه

mhd.mirzayi
یک شنبه 27 مرداد 1392, 14:32 عصر
با تشکر از بهزاد عزیز
آیا لازم نیست توی کلاس commentیه propertyدیگه که کلید خارجی کلاس خبر رو دخیره کنه مثل این:

public class Comment
{
public int CommentID { get; set; }
public int NewsID{ get; set; }
public string Body { get; set; }

public News News { get; set; }
}

mhd.mirzayi
دوشنبه 28 مرداد 1392, 12:14 عصر
سلام بهزاد جان

تشکر از جوابتون می شه لطف کنین و بگین که اگه بخواییم از فرم ای جکس استفاده کنیم همین viewچطوری می شه؟

بهزاد علی محمدزاده
دوشنبه 28 مرداد 1392, 14:17 عصر
آیا لازم نیست توی کلاس commentیه propertyدیگه که کلید خارجی کلاس خبر رو دخیره کنه

نه لازم نیست . خود EF این کار رو انجام میده . می تونید تنظیمات دستی مفصلی هم داشته باشید که در اینصورت باید برید و Code First رو خوب یادبگیری . در طراحی شی گرا مثل پایگاه داده رابطه ایی عمل نمی کنیم . به این مثال دقت کن : بین دو موجودیت A‌ و B‌ اگر خواستیم رابطه 1:1 برقرار کنیم در هر دوی اینها یه ارجاع به اون یکی میدیم :

public class A
{
public int AID{get; set;}
public virtual B B{get; set;}
}
public class B
{
public int BID{get; set;}
public virtual A A{get; set;}
}

و برای 1:N . در اینجا ( شی گرا ) N یعنی مجموعه ایی از ‌B رو در A داریم . و در B‌ هم یه ارجاع به A . نکته : این مجموعه بسته به زبان پیاده سازی آرایه ایی از B در سمت A ‌هست . ( یا آرایه یا List و ... ) :

public class A
{
public int AID{get; set;}
public virtual ICollection<B> B{get; set;}
}
public class B
{
public int BID{get; set;}
public virtual A A{get; set;}
}

‌و برای M:N هم داریم :

public class A
{
public int AID{get; set;}
public virtual ICollection<B> B{get; set;}
}
public class B
{
public int BID{get; set;}
public virtual ICollection<A> A{get; set;}
}

بهزاد علی محمدزاده
دوشنبه 28 مرداد 1392, 14:25 عصر
برای استفاده از Ajax بهتره که یه مطالعه خوب داشته باشید تا نکاتش و درک کنی .

mhd.mirzayi
دوشنبه 28 مرداد 1392, 16:23 عصر
بهزاد جان می تونی یه منبع مناسب برای یادگیری MVC معرفی کنید؟ اگه فارسی باشه که خیلی بهتره

تشکر

بهزاد علی محمدزاده
دوشنبه 28 مرداد 1392, 17:03 عصر
مقالات http://www.dotnettips.info/ (http://www.dotnettips.info/)

در مورد MVC و Code First لینک بالا مقالات خوبی داره . کتاب فارسی هم آقای بهروز راد داره . به عنوان مرجع ازش می تونی استفاده کنی . این تنها گزینه ی روی میز هست ...

mhd.mirzayi
پنج شنبه 31 مرداد 1392, 12:29 عصر
سلام بهزاد جان
میشه راهنماییم کنی چطوری می تونم کامتی که برای Articleدرج میشه رو چطوری میشه با Json به اکشن مورد نظر فرستاد و نتیجه که باید در انتهای لیست کامت ها باید بیاد چطوری می شه نشون داد

تشکر

ali_autumnal
پنج شنبه 31 مرداد 1392, 13:05 عصر
شبیه کدهای زیر می تونید بنویسید

کدهای View مربوطه


@using (Ajax.BeginForm("CreateComment", "ViewPage", new { id = Model.PageViewModel.PageID }, new AjaxOptions
{
HttpMethod = "post",
OnSuccess = "CommentPage"
}, new { @id = "PageCreateComment" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true)
@Html.HiddenFor(m => m.CommentCreateModel.ParentId)
@Html.HiddenFor(m => m.CommentCreateModel.PageId)
@Html.TextAreaFor(model => model.CommentCreateModel.Content, new { @onkeypress = "CommentSubmit()", @id = "CommentCreateModelText" })
}


کدهای JQuery مربوطه برای onkeypress:

function CommentSubmit() {
var x;
if (window.event) // IE8 and earlier
{
x = event.keyCode;
}
else if (event.which) // IE9/Firefox/Chrome/Opera/Safari
{
x = event.which;
}
keychar = String.fromCharCode(x);
if (x == 13) {
$('#PageCreateComment').submit();
//add comment refresh page
$('#CommentCreateModelText').val('');
}
}


کدهای Action مربوطه:


[HttpPost]
[ValidateAntiForgeryToken]
public void CreateComment(CommentCreateModel CommentCreateModel)
{
//var My = User.Identity;
//پس از تکمیل پروژه بایستی نام کاربری خوانده شود و به تابع ارسال شود
if (ModelState.IsValid && Request.IsAjaxRequest())
{
//Insert
}
}