PDA

View Full Version : مشکل در ثبت نظر ...



alireza_rashvand
شنبه 25 مرداد 1393, 19:19 عصر
سلام
در قسمتی از پروژه (اموزشی ام) ام می خوام نظر مخاطبین را ذیل پست ثبت کنم.

ساده ترین راه:
1- ActionLink
استفاده از ActionLink به عنوان لینک ثبت نظر,

@Html.ActionLink("ثبت نظر", "InsertComment", "Comments", new { id = @Model.Post.Id }, null);


2- Controller
ایجاد یک کنترلر (Comments)

3- ActionResult
ساخت اکشن (InsertComment)

[HttpPost]
public ActionResult InsertComment(Comment _comment, int id)
{


if (this.ModelState.IsValid)
{
using (var db = new Context())
{
db.Comments.Add(new Comment
{
Name = _comment.Name,
Content = _comment.Content,
PostId = id,
DateCreated = DateTime.Now
});
db.SaveChanges();
ViewBag.Message = "با موفقیت ثبت شد";
}
return RedirectToAction("show", "Posts", new { id });
}


return RedirectToAction("InsertComment");
}


4- Add View
5- Model Class
6- Scaffold : Create

@model Projects.Models.Comment


@{
ViewBag.Title = "InsertComment";
}

@using (Html.BeginForm()) {
@Html.ValidationSummary(true)


<fieldset>
<legend>ثبت نظر</legend>


<div >
@Html.LabelFor(model => model.Name)
</div>
<div >
@Html.EditorFor(model => model.Name)
@Html.ValidationMessageFor(model => model.Name)
</div>


<div >
@Html.LabelFor(model => model.Content)
</div>
<div >
@Html.TextAreaFor(model => model.Content)
@Html.ValidationMessageFor(model => model.Content)
</div>
<p>
<input type="submit" value="ثبت نظر" />
</p>
</fieldset>
}


کلیک روی دکمه ثبت نظر , تمام!

حالا قصد دارم فیلدست رو در داخل نمایش پست داشته باشم یعنی زیر خود پست ثبت نظر کنم بدون اینکه برم به صفحه ای دیگر برگردم.

برای این کار به جای استفاده از

@Html.ActionLink("ثبت نظر", "InsertComment", "Comments", new { id = @Model.Post.Id }, null);

از Partial استفاده کردم

@Html.Partial("_InsertComment",@Model.Comment);




خود Partial _InsertComment رو هم به این صورت نوشتم


@model Projects.ViewModels.PostCommentsViewModel
@using (Html.BeginForm(actionName: "InsertComment", controllerName: "Posts", routeValues: new { id = @Model.Post.Id }))
{
@Html.ValidationSummary(true)
@Html.AntiForgeryToken()


<fieldset>


<div>
@Html.LabelFor(model => model.Comment.Name)
</div>
<div>
@Html.TextBoxFor(model => model.Comment.Name)
@Html.ValidationMessageFor(model => model.Comment.Name)
</div>


<div>
@Html.LabelFor(model => model.Comment.Content)
</div>
<div>
@Html.TextAreaFor(model => model.Comment.Content)
@Html.ValidationMessageFor(model => model.Comment.Content)
</div>
<p>
<input type="submit" value="ثبت نظر" />
</p>
</fieldset>
}


PostCommentsViewModel رو دیگه شرح نمی دم که طولانی نشه , این ویومدل موارد مورد نیاز نمایش یک پست همراه با نظراتش رو در اختیار قرار میده (توضیحات بیشتر (http://barnamenevis.org/showthread.php?461129-%D9%86%D9%85%D8%A7%DB%8C%D8%B4-%D9%86%D8%B8%D8%B1%D9%87%D8%A7%DB%8C-%D9%BE%D8%B3%D8%AA&p=2066224&viewfull=1#post2066224) )

در _InsertComment کنترلر برگشتی رو به جای کنترلر دیگر به خود پست تغییر دادم و InsertComment که در شماره 3 دیدید رو داخل کنترل پست نوشتم.

مشکلی که الان دارم اینکه حالا که فیلدست ثبت نظر زیر پست قرار دراه _commentرا null برمی گردونه و نکته بعدی اینکه اگر بخواهم خطاها رو کنترل کنم و فیلد ها خالی نشند return اکشن در حالت this.ModelState.IsValid چی باید باشه
امیدوارم با اینکه طولانی شد و نتونسته باشم مشکل رو خوب توضیح داده باشم.

hadi0x7c7
یک شنبه 26 مرداد 1393, 13:17 عصر
شما یه فرم ساده، پایین کامنتا قرار بده و دکمه ثبت نظر رو به صورت Ajax.Action بساز و باقیه کارا رو ای جکسی انجام بده(یا همون action ساده، پارشال ویوو بیشتر واسه این استفاده میشه که شما میخوای توی یک قسمت صفحه، یه سری html تزریق کنی، مثلا برای لیست کامنتا از یه پارشال استفاده کن) در واقع مدل پارشال ما میشه لیست کامنتا، و مدل فرم پایین صفحه میشه فیلدای کامنت(تاریخ، متن، و ..)

alireza_rashvand
یک شنبه 26 مرداد 1393, 14:57 عصر
سپاس, هنوز Ajax در MVC رو کار نکردم مثل اینکه باید دست به کار شم :)
اگه نمونه کدیا لینکی در این مورد بدید ممنون می شم.

ولی نمونه هایی دیدم که با پارشال همچین مواردی رو به فرم تزریق کردند.. (مثلا (http://www.dotnettips.info/post/1810/استفاده-از-چند-فرم-در-کنار-هم-در-asp-net-mvc))

سوالی اصلیم اینکه چه اتفاقی در راه حل ساده اتفاق می افته که در راه حل بنده جواب نمیده؟! مشکل کار بنده ایا همان پارشال است؟

hadi0x7c7
یک شنبه 26 مرداد 1393, 19:46 عصر
بشین بنویس، هرجاش که به مشکل خوردی مطرح کن ، تونستیم کمک میکنیم! فقط برنامه نویسی یه فازی داره که شما هرچه سریع تر باید ازش بتونی رد شی، اونم فاز حالا چی کارش کنمه:لبخند: یا چطوری میشه، اگه بتونی این تیکه رو رد کنی دیگه تا آخر عمرت راحتی! البته جسارت نشه، ما هممون هنوز شاگرد هستیم

alireza_rashvand
یک شنبه 26 مرداد 1393, 20:19 عصر
:)حق با شماست,
همه این تاپیک های که ایجاد می کنم بیشتر بار اموزشی داره, می خواهم بدونم که چه اتفاقی در این بین می افته که داده بو صورت نال دریافت می شه,
خیلی به دنبال راه حله دیگه نمی گردم
منظورم اینکه می خواهم بدونم ایا این راه حل که نوشتم درسته یا نه؟
ایا کلا نمی شه به این صورت نوشت,؟ فقط به این صورت که شما فرمودید این موضوع قابل حله؟
یا نه, در جایی در کد نویسی دچار مشکل شدم.
منظورم هم از لینک , لینک در مورد AJax در MVC است که یاد بگیرم.
به هر حال سپاس ,

hadi0x7c7
یک شنبه 26 مرداد 1393, 22:26 عصر
من اینو نوشتم، فکر کنم تقریبا درست باشه

البته کانکشن استرینگ رو به این تقییر بدید که مشکلی نخورید
<connectionStrings>
<clear/>
<add name="CommentConn" connectionString="Data Source=(localdb)\v11.0; Initial Catalog=CommentTest; Integrated Security=SSPI" providerName="System.Data.SqlClient"/>
</connectionStrings>

و این تغییر هم در کلاس کانتکست
public CommentContext()
: base("CommentConn")
{
}

122380

alireza_rashvand
دوشنبه 27 مرداد 1393, 16:24 عصر
سپاس از لطفتان, نکات خیلی خوبی رو یاد گرفتم, دارم تلاش می کنم از روش شما برسم به راه حل خودم :)
روش شما خیلی خوب جواب داد,
@using (Html.BeginForm("CreateComment", "Blog")) {
@Html.TextBox("Content")
<input type="submit" value="send" />
}
دارم سعی می کنم در ابتدا model رو اضافه کنم بعد ببینم بخواهم بصورت partial بنویسم چطور می شه .
بازهم سپاس.