ورود

View Full Version : آموزش: خالی کردن فرم



alef.divar
سه شنبه 20 اسفند 1392, 14:17 عصر
سلام
من یه فرم ایجاد کردم که نظرات کاربر ها رو میگیره و میخوام وقتی کاربر کلید ثبت نظر رو زد زیر دکمه نوشته بشه "نظر شما با موفقیت ثبت شد". و فرم پاک بشه.
برای پاک شدن فرم باید یک مدل خالی به صفحه ارسال کنی که من اینکارو کردم اما فرم پاک نمیشه:
لطفا راهنمای کنید.


کد مربوط به view:

@model ShailyMVC.Models.poll
@{
ViewBag.Title = "نظر شما";
}
<h2>نظر شما</h2>
@using (Html.BeginForm()) {
@Html.ValidationSummary(true)
<fieldset dir="rtl">
<legend>نظر شما</legend>
<div class="editor-label">
@Html.LabelFor(model => model.title)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.title)
@Html.ValidationMessageFor(model => model.title)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.context)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.context)
@Html.ValidationMessageFor(model => model.context)
</div>
<p>
<input type="submit" value="ثبت" />
</p>
<p>
@if (IsPost)
{
<span>@ViewBag.MessPoll</span>
}
</p>
</fieldset>
}

<div>
<!-- @Html.ActionLink("بازگشت به لیست", "Index") -->
</div>

@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}



کد مربوط به controller:

public ActionResult Create()
{
poll p = new Models.poll();
p.title = "";
p.context = "";
return View(p);
}

[HttpPost]
public ActionResult Create(poll poll)
{
if (ModelState.IsValid)
{
ViewBag.MessPoll="نظر شما با موفقیت ثبت شد.";
db.polls.Add(poll);
db.SaveChanges();
poll p = new Models.poll();
p.title = "";
p.context = "";
return View(p);
}
return View(poll);
}



ممنون میشم زود پاسخ بدید.

hakim22
سه شنبه 20 اسفند 1392, 17:54 عصر
دستور Return View(p در متد پست با هر مقدار ورودی دوباره همین متد پست رو اجرا میکند. از آنجا که اطلاعاتی که از روش پست ارسال میشوند در چرخه باقی می ماند ، مقادیر خالی قبل از به نمایش در آمدن دوباره از فرم ارسالی قبلی باز خوانی و پر میشود.

شما میتوانید برای آنالیز بهتر داده هایی که ارسال و دریافت می شوند از Fiddler یا قسمت Network در مرورگر استفاده کنید تا دقیقا محتوای Http ارسالی را بررسی کنید. مشکل شما این است که دستور متد اطلاعات فرم ارسالی را بعد از اجرا پاک نمیکند. این اتفاق در مرورگرها معمولا به کاربر گوشزد میشود چون ممکن است کاربر با جلو و عقب رفتن در مرورگر دوباره اطلاعات قبلی را به سرور ارسال کند که در مواردی مانند تراکنش های مالی بانکی میتواند بسیار دردسر ساز شود. به هر حال این ذات متد پست است. به منابع آموزش پروتکل Http مراجعه کنید.

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