PDA

View Full Version : سوال: برگشت نکردن مقدار Json از ظرف کنترلر



r4hgozar
جمعه 12 تیر 1394, 13:27 عصر
سلام.
من یه هفتس درگیر این شدم که چرا کد های جدید ajax که می نویسم درست عمل نمی کنه.
خود همین رو تو همین پروژه نوشتم واسه یه کنترلر دیگه کار می کنه اما اینجا با ورودی های جدید درست عمل نمی کنه.
این روش اول که کلا مقداری رو پاس نمیده طرف کنترلر
(یعنی وقتی رو دکمه submit کلیک می کنم دوباره کنترلر Details عمل می کنه)



public ActionResult Details(string PostUrl)
{
var ticket = _post.Gets().FirstOrDefault(n => n.PostUrl == PostUrl);
var model =new ArticaleVm()
{
PostAdminVm = _post.Gets().FirstOrDefault(n => n.PostUrl == PostUrl),
CommentAdminVms = _comment.UserComment(ticket.Id).Where(i=>i.Show ==true)
};
return View(model);
}






این کنترلر که باید json کار کنه





[HttpPost]
public ActionResult Comment(CommentAdminVm model, Guid pid, string CaptchaDeText2)
{
if (ModelState.IsValid)
{
try
{
model.PostId = pid;
if (_comment.Insert(model))
{
return Json(true, JsonRequestBehavior.AllowGet);
}
return Json(false, JsonRequestBehavior.AllowGet);
}
catch
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
return Json(false, JsonRequestBehavior.AllowGet);
}





این هم کد صفحه



@using (Html.BeginForm("Comment", "Article", FormMethod.Post, new { id = "MyForm" }))


واین هم jquery



<script type="text/javascript">
$(function () {
$('#ok').click(function (e) {
e.preventDefault();
$.ajax({
type: "POST",
Url: '/Article/Comment',
data: {
Pid: $('#pid').val(),
Name: $('#NameC').val(),
Body: $('#BodyC').val(),
Email: $('#EmailC').val(),
PhoneNumber: $('#PhoneNumberC').val(),
},
datatype: "Json",
success: function (data, status) {
if (data == true) {
swal("ثبت شد!", "نظر شما با موفقیت ثبت گردید", "success");
} else
alert("اطلاعات و کد انسان شناس را درست وارد نمایید");
},
error: function () {
alert("قطع ارتباط با سرور");
}


});
});


});
</script>








اخر مجبور شدم از روش زیر استفاده کنم اما بازم مقدار برگشتی میده ture اما alert پایین درست کار نمی کنه.
این روش (مقدار برگشت می کنه اما function done مقداری رو نمی گیره تا alert رو نمایش بده)
هر چی رو فکر کنین چک کردم اما درست کار نمی کنه. یک هفتس خسته شدم واقعا.





[HttpPost]
public ActionResult Comment(CommentAdminVm model)
{
if (ModelState.IsValid)
{
try
{

if (_comment.Insert(model))
{
return Json(true, JsonRequestBehavior.AllowGet);
}
return Json(false, JsonRequestBehavior.AllowGet);
}
catch
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
return Json(false, JsonRequestBehavior.AllowGet);
}






@using (Ajax.BeginForm("Comment", "Article", FormMethod.Post, new AjaxOptions { HttpMethod = "POST", OnSuccess = "done(data)" }))









@section scripts
{
<script src="~/Content/dist/sweetalert.min.js"></script>
<script type="text/javascript">
$(function () {
function done(data) {
if (data == true) {
swal("ثبت شد!", "نظر شما با موفقیت ثبت گردید", "success");
}
else
alert("اطلاعات و کد انسان شناس را درست وارد نمایید");


}
});
</script>


}

Hamid2547
شنبه 13 تیر 1394, 00:34 صبح
لطفا توضیح بدید کنترلتون در چه صورتی باید ترو و در چه صورتی فالس برگردونه، چیزی که من الان میبینم، این کد جی کوئری مقادیر رو پست میکنه به اون ادرس، یک بریک پوینت بذارید ببینید چی به جاوا اسکریپت بر میگرده، کدهای مدلتون CommentAdminVm رو هم قرار بدید شاید چیزی که از اسکریپت فرستادید رو بایندر نمیتونه مپ کنه به مدلتون.

r4hgozar
شنبه 13 تیر 1394, 10:40 صبح
لطفا توضیح بدید کنترلتون در چه صورتی باید ترو و در چه صورتی فالس برگردونه، چیزی که من الان میبینم، این کد جی کوئری مقادیر رو پست میکنه به اون ادرس، یک بریک پوینت بذارید ببینید چی به جاوا اسکریپت بر میگرده، کدهای مدلتون CommentAdminVm رو هم قرار بدید شاید چیزی که از اسکریپت فرستادید رو بایندر نمیتونه مپ کنه به مدلتون.

در صورتی که

if (_comment.Insert(model))

اون رو هم تست کردم.
میفرسته اما بازم نمی شه. یعنی بایند میشه

niloo17
دوشنبه 15 تیر 1394, 12:55 عصر
اگر action شما کامل اجرا می شه و مشکتلون دریافت مقدار در javascript : مقدار بازگشتی action را به صورت زیر تعریف کنید .


return Json(new { return= "True" }, JsonRequestBehavior.AllowGet);


و در java مقدار را به صورت زیر دریافت کنید.


success: function (response) {

if (response.return== "True") {

swal("ثبت شد!", "نظر شما با موفقیت ثبت گردید", "success");
} else
alert("اطلاعات و کد انسان شناس را درست وارد نمایید");
},
error: function () {
alert("قطع ارتباط با سرور");
}


}


اگر کلا action اجرا نمی شه نمونه کد کامل ثبت comment براتون بذارم.

r4hgozar
چهارشنبه 17 تیر 1394, 16:27 عصر
ممنون.
تو روش اولی که گفتم کلا مقداری به action پاس داده نمیشه.
یعنی رو همون detail دوباره اجرا میشه و به Cooment نمیره.

اما این روش شما رو هم تست می کنم.

niloo17
پنج شنبه 18 تیر 1394, 08:55 صبح
دلیلی که به اکشن پاس نمیده اینه که شما مقدار ورودی اکشن را به صورت مدل تعریف کردید.


public ActionResult Comment(CommentAdminVm model)

در صورتی که در جاوالسکریپت یک سری پارامتر فرستادید. واسه همینه که اکشن پیدا نمی کنه


data: { Pid: $('#pid').val(),

Name: $('#NameC').val(),

Body: $('#BodyC').val(),

Email: $('#EmailC').val(),

PhoneNumber: $('#PhoneNumberC').val(),

},



باید نوع داده ای ها یکسان باشه مثلا .


public ActionResult Comment(string Pid,string Name, string Body, strng Email , string PhoneNumber )

r4hgozar
پنج شنبه 18 تیر 1394, 12:13 عصر
این کار رو هم کرده بودم قبلا.
اما باز هم جواب نداده.
هر چی و هر کاری به ذهنم میرسید انجام دادم.
دوستان تا حالا براتون اتفاق نیوفتاده؟

r4hgozar
پنج شنبه 18 تیر 1394, 12:48 عصر
یک سال دارم کد می زنم. 100 تا کد ajax نوشتم کار کرد و مشکلاتش برطرف کردم.
وقتی نتونم یه دستور به این ساده ای رو درست کنم 2 هفتس درگیرشم. به درد لای جرز دیوارم نمی خورم.
برم فلافل بفروشم بهتره. والا

r4hgozar
پنج شنبه 18 تیر 1394, 14:54 عصر
من مشکلم رو حل کردم اما با ajax.beginform.
الان فهمیدم مشکلم اینه که کلا توابع جاوا اسکریپت که پایین استفاده می کنم کلا اجرا نمیشه حالا این توابع بخواد $.ajax باشه و یا یک function معمولی.
فقط چیزهایی مثل alert کار می کنه و یا اینکه


$(".text").val()


و بعدشون کار نمی کنه.
یعنی اگه بخوام ajax بنویسم یا مقدار برگشتی رو چک کنم چه با جاوا و چه با function کلا دستوران اجرا نمیشه.

منون میشم اساتید و دوستان راهنمایی کنند.

meisam12
سه شنبه 23 تیر 1394, 22:52 عصر
با سلام
1- شما در اکشن Comment ورب(verb) متد رو post در نظر گرفتید در صورتی که تابع شما زمانی که می خواهد خروجی را برگرداند شما می گویید که اجازه get داده شود شما به صورت زیر تغییر دهید :

return Json(false, JsonRequestBehavior.DenyGet);


2- در ضمن شما زمانی که دیتا را می خواهید به اکشنی که از نوع json می باشد post کنید حتماً از تابعع JSON.stringify استفاده کنید

3- شما بهتر است که زمانی به اکشن از نوع json می فرستید contentType را به applicattion/json تنظیم کنید.

4- اگر متغیر Pid ازنوع عددی باشد شما باید به عدد تبدیل کنید.

Pid: parseInt($('#pid').val())


پس لطفاً jqueryتان را به صورت زیر تغییر دهید. ا
امیدوارم این توضیحات کارتون رو راه بندازه.


<script type="text/javascript">
$(function () {
$('#ok').click(function (e) {
e.preventDefault();
$.ajax({
contentType:"application/json",
type: "POST",
Url: '/Article/Comment',
data: JSON.stringify({
Pid: parseInt($('#pid').val()),
Name: $('#NameC').val(),
Body: $('#BodyC').val(),
Email: $('#EmailC').val(),
PhoneNumber: $('#PhoneNumberC').val(),
}),
datatype: "Json",
success: function (data, status) {
if (data == true) {
swal("ثبت شد!", "نظر شما با موفقیت ثبت گردید", "success");
} else
alert("اطلاعات و کد انسان شناس را درست وارد نمایید");
},
error: function () {
alert("قطع ارتباط با سرور");
}


});
});


});
</script>

meisam12
سه شنبه 23 تیر 1394, 23:07 عصر
1- اگه باز جواب نگرفتی شاید به خاطر اون خطی باشه که می خواهی جلوی پست فرم رو بگیری اگه از اون باشه خط e.preventDefault(); رو پاک کن.
2- برای این که جلوی پست فرم رو بگیری از روش زیر می تونی استفاده کنی.

$(document).ready(function(){
$("form").submit(functiom(e){
e.preventDefault();
});
});

meisam12
سه شنبه 23 تیر 1394, 23:15 عصر
در ضمن شما از سمت سرور فقط یک شی بر میگردونید.
1- یعنی در success تابعی که تعریف کردید باید یک متغیر اعلان شود.
2- اگر خروجی تابع شما بیش از یک متغیر دارد باید به صورت شی مدلتان را برگردونید.

return Json(new{
Status = true,
Message: "success operation"
},JsonRequestBehavior.DenyGet);


3- در قسمت success تابع به صورت زیر تعریف شود.

success: function (result) {
if (result.Status == true) {
swal(result.Message, "ثبت گرديد", "success");
} else
alert("اطلاعات و کد انسان شناس را درست وارد نماييد");
}