PDA

View Full Version : ارسال پارامتر از جاوااسکریپت به یک تابع در مدل



نیکناز
جمعه 11 مرداد 1392, 11:24 صبح
سلام دوستان
من یه کلاس دارم که توش یه تابع دارم .
چه جوری میتونم از view از بلاک javascript پارامتر به این تابع پاس بدم ؟
کلاس من :


public class CityClass {
public static long GetIdCountryWithCountryText(string countryy)
{
using (SportContext db = new SportContext())
{
return db.tbl_contry.FirstOrDefault(p => p.country== countryy).id;
}
}
}

p.parsaee
جمعه 11 مرداد 1392, 11:35 صبح
سلام

برای این کار توی یکی از کنترلر ها (بهتره کنترلر مربوط به اون view باشه ) یک اکشن متد تعریف کنی. مثلا همین متد GetIdCountryWithCountrytext رو ببر داخل یه کنترلر فقط حواست باشه این متد دیگه نباید static باشه. خوب حالا یه اکشن متد تعریف کردی.

فرض کن این متد رو بردی داخل کنترلر Home تعریف کردی. حالا با کد زیر می تونی به اون دسترسی داشته باشی:



var url = "@Url.Action("GetIdCountryWithCountryText", "Home")";


پارامتر هم بخوای بهش پاس بدی با مثلا jQuery Ajax می تونی این کارو انجام بدی . منظورم $.ajax هست.

نیکناز
جمعه 11 مرداد 1392, 14:04 عصر
خوب من می تونم اون مقدار بازگشتی که از اون تابع گرفتم رو به یه فیلد تو مدلم ست کنم؟
یعنی بیام با jQuery Ajax پارامتر پاس بدم ، بعد نتیجه اشو بریزم تو فیلدی تو مدلم . مثلا" فیلد id

hakim22
جمعه 11 مرداد 1392, 16:39 عصر
سیستم Model binding در ASP.MVC خیلی قویه شما مشخص نکردید که آیا یک Form دارید و Submit میشه یا میخواهید بدون اینها کار رو انجام بدید ؟
اصولا با یک Form و یک مدل یا ViewModel کار شما خیلی راحته

p.parsaee
جمعه 11 مرداد 1392, 17:47 عصر
نه دوست من نمیشه

اصولا وقتی داری با jQuery Ajax کد می نویسی این کد فقط توی مرورگر کاربر اجرا میشه ولی این کاری که شما می خوای انجام بدی باید قبل از ارسال شدن کد از سرور به طرف مرورگر کاربر صورت بگیره.

قبل از این که بخوام جوابتو بگم اینو بدون که توی وب کلا دو نوع تکنولوژی داریم:
اول : تکنولوژی های سمت سرور (server side) مثل ASP.Net ، یا ASP.Net MVC یا php و غیره
دوم : تکنولوژی های سمت کاربر یا سمت کلاینت (client side) مثل html و Css و java script و jquery

در معماری کلاینت - سروری کلاسیک ، کلاینت درخواستی رو به سمت سرور می فرسته ، سرور درخواست اونو اجرا می کنه و نتیجه اون درخواست رو به طرف مرورگر کاربر می فرسته.

مثلا وقتی شما سایت www.barnamenevis.org (http://www.barnamenevis.org) رو توی نوار آدرس مرورگر خودت می زنی و بعد Enter رو فشار می دی، یک درخواست به سرور می فرستی، سرور یک سری کدهای سمت سروری اجرا میکنه (شامل کدهای php ) نتیجه رو شکل کدهای html و css و java script و jquery تحویل به مرورگر کاربر میده. حالا مرورگر کاربر هم این بار این چیزهایی که تحویل گرفته رو اجرا می کنه. سرور هیچ وقت سمت خودش کد java script اجرا نمی کنه (یا کد jquery ) اینا کدهای سمت کلاینتی مفسرهایی که درون مرورگرها وجود دارن قابل اجرا هستن.

در واقع شما می خوای توی مروگر کاربر با کد jQuery یه فیلد از مدلت رو تغییر بدی، مرورگر که کد سی شارپ و مدل view رو نمی تونه درک کنه. پس باید قبل از این که کد به سمت مرورگر میاد این کارو انجام بدی و اون هم توسط دستورات سی شارپ و کدنویسی سمت سروری.

اگه بیشتر راهنمائی کنی که می خوای چی کار کنی بهتر می تونم راهنماییت کنم. شاید اصلا به قول دوستمون hakim22 کارت با ViewModel حل شه.

اگه از کنترلر می خوای مقادیری رو به سمت view پاس بدی چندین روش وجود داره. ViewModel یا ViewBag یا TempData می تونن این کارو برات انجام بدن. آقای وحید نصیری توی سایت نکته های دات نت این روشها رو توضیح داده :

http://www.dotnettips.info/post/807/asp-net-mvc-5

نیکناز
جمعه 11 مرداد 1392, 18:02 عصر
خوب ببینید من یه کمبو دارم . که آیتم های توش از دو تا جدول می یان . که با هم ریلیشن دارن .

مثلا فرض کنید هر آیتمش اینجوریه : " ایران ، استقلال " یا مثلا "انگلستان ، منچستر یونایند " یا " برزیل ، استقلال"

من باید تو مدلم id-team رو پر کنم . یعنی آی دی عنصر دوم هر آیتم .

که با زدن دکمه "ذخیره" این مدل پر شده رو برای اکشن register بفرستم .

من چه جوری این کار و باید بکنم؟

hakim22
جمعه 11 مرداد 1392, 20:25 عصر
برای اینکار باید از AJAX استفاده کنید. ارسال داده به سرور و گرفتن مقدار برگشتی بدون اینکه post انجام بشه در فرم از این طریق ممکنه . مثل گوگل که وقتی شروع به تایپ می کنید میره و بانک رو میگرده و یک سری نتایج رو نشون میده درحالی که هنوز دکمه submit یا همون جستجو زده نشده

p.parsaee
جمعه 11 مرداد 1392, 21:32 عصر
لازم نیست حتما توی view این کاری رو که گفتی رو انجام بدی (البته اگه دقیقا همین کاری که گفتی رو می خوای انجام بدی یا دقیقا مشابه به این)

می تونی با jQuery Ajax این کار رو انجام بدی. یعنی یه اسکریپت jQuery Ajax بنویسی که توی رویداد document.ready صفحه یه درخواست ajax ی به طرف یه اکشن متد از کنترلر از سرور بفرسته و اگه نیاز داری id یا چیز خاصی هم به این اکشن متد پاس بدی مشکلی نیست می تونی این کارو انجام بدی. بعد اکشن متد مربوطه هم داده ها رو باید به صورت JSON دربیاره و اونو return کنه. یعنی نوع خروجی اکشن متد شما باید JsonResult باشه و از دستور return Json استفاده کنید.

یه مثالی از این کار توی لینک زیر هست :
http://barnamenevis.org/showthread.php?391109-%D8%A8%D8%A7%D9%86%D8%AF-%DA%A9%D8%B1%D8%AF%D9%86-%D8%A7%D8%B7%D9%84%D8%A7%D8%B9%D8%A7%D8%AA-%D8%AF%D8%B1-%DB%8C%DA%A9-%D8%AC%D8%AF%D9%88%D9%84-%D8%A8%D8%A7-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-ajax&p=1735870#post1735870

نیکناز
جمعه 11 مرداد 1392, 22:54 عصر
خوب من این چیزایی که شما دوستان می گید و خودم یه جورایی انجام داده بودم .
ولی فکر می کنم یه جاهایشو اشتباه می کنم یا کامل انجام نمی دم . نمی دونم دقیقا .

کنترلر من :(Account Controller)




public ActionResult SomeAction(string countryy)
{

var result = MyClass.GetIDCountryWithCountryText(countryy);
return Json(result, JsonRequestBehavior.AllowGet);

}



کلاس من : (MyClass)




public class MyClass {

public static long GetIDCountryWithCountryText (string keshvar)
{
using (SportContext db = new SportContext())
{
return db.tbl_contry.FirstOrDefault(p => p.country== keshvar).id;
}
}
}




view :





$(document).ready(function () {


jQuery('#TeamVaKeshavr').change(function(){

var str = document.getElementById('TeamVaKeshavr').value;
var str1 = str.split(", ", 1).toString();


$.ajax({
url: '/AccountController/someaction',
data: { countryy: str1 },
cache: false,
type: 'GET',
success: function (result) {
alert('ok');


}
});


});




});




خوب الان من تو مدلم چه جوری id_keshvar رو پر کنم یا حالا هر چیز دیگه . با توجه به اینکه دوستان می گن کد سمت سروره و نیمشه .
الان من با مقدار بازگشتی از بلاک جاوا اسکریپت باید چه کار کنم؟
اصلا کار من درسته؟