PDA

View Full Version : سوال: درج داده در جدول توسط partial view بدون استفاده از ajax



bftarane
یک شنبه 20 خرداد 1397, 00:00 صبح
سلام
من می خوام یک فرم درج در پارشیال ویو داشته باشم، حالا می خوام این پارشیال ویو رو در یک ویو بندازم و بدون استفاده از ajax یا jquery.ajax
ثبت داده انجام بشه.

متأسفانه به مشکل خوردم.
این کوئری جدول هست

USE [testdb]
GO

/****** Object: Table [dbo].[tblTest] Script Date: 6/9/2018 11:37:34 PM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[tblTest](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Title] [nvarchar](255) NOT NULL,
CONSTRAINT [PK_tblTest] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
کدهای کنترلر به این صورته

public class PartialManagerController : Controller
{
// GET: PartialManager
public ActionResult Index()
{
return View();
}

private testdbEntities db = new testdbEntities();
public ActionResult MyPartialAction([Bind(Include = "Id,Title")] tblTest tblTest)
{
if (ModelState.IsValid)
{
db.tblTests.Add(tblTest);
db.SaveChanges();

}

return View(tblTest);
}
}
و این هم کدهای پارشیال ویو هست

@model TestPartialCrud.Models.tblTest

@using (Html.BeginForm())
{
@Html.AntiForgeryToken()

<div class="form-horizontal">
<h4>tblTest</h4>
<hr />
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Title, "", new { @class = "text-danger" })
</div>
</div>

<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
}
این هم نحوه فراخوانی پارشیال ویو

@{
ViewBag.Title = "Home Page";
}
@{
Html.RenderAction("MyPartialAction", "PartialManager");
}

الان با 2 تا مشکل مواجه هستم
اول اینکه به محض اینکه [HttpPost] رو بالای اکشن قرار می دم با این خطا مواجه می شم
که داره میگه اکشن رو پیدا نمی کنه
A public action method 'MyPartialAction' was not found on controller 'TestPartialCrud.Controllers.PartialManagerControl ler'.
also when I add this code to action

و دیگه اینکه با قرار دادن کد درج در اکشن، یعنی کد زیر

if (ModelState.IsValid)
{
db.tblTests.Add(tblTest);
db.SaveChanges();

}
با این خطا مواجه میشم
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

یعنی کار به کلیک کردن روی دکمه درج هم نمی کشه، و همینکه صفحه اجرا میشه این خطا رو میده.


لطفا راهنمایی کنید، چطور می تونم این کار رو انجام بدم؟
متأسفانه اکثر مثال هایی که در اینترنت هست این کار رو با jquery.ajax آموزش داده ولی من باید این کار رو بدون ajax انجام بدم.

hakim22
یک شنبه 20 خرداد 1397, 01:07 صبح
اول باید دقت کنید که پارشیال ویو کاری نمیکنه جز جای گذاری محتویاتش درون ویوی مادر . در واقع مثل اینه که کپی و پیست کنید.

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

برنامه نویسی از پایین به بالا معمولا باعث میشه مسیرهای غلط زیادی برید و دیباگ کردن پروژه هم مشکل میشه.

برای حل مشکل اول باید آدرس اکشن و کنترلر هدف رو مشخص کنید :


Html.BeginForm("ActionName", "Controller", FormMethod.Post)


علت مشکل دوم خطای ثبت اطلاعات در دیتابیسه. اطلاعات ارسالی به سرور ولید نیست. (طبیعیه چون شی شما به سرور نال ارسال میشه )
وقتی مشکل اول رو حل کردید این مشکل هم حل میشه.

bftarane
یک شنبه 20 خرداد 1397, 08:50 صبح
ممنون، مشکل این بود هم باید اکشن httpGet و هم httpPost می داشتم.
فکر می کردم در مورد پارشیال ویو ها این مسئله تفاوت داشته باشه.