ورود

View Full Version : نگهداری رکوردهای ثبت شده در لیست و ثبت یکباره در بانک



resident
شنبه 26 بهمن 1392, 11:06 صبح
فرض کنید یه فرم دارم که یه لیست رو نمایش میده. بالاشم یه فرم دارم که می تونم یه مورد جدید اضافه کنم(از نوع مدلی که لیست رو نمایش میده.)
روال کار هم اینطوره که کاربر اطلاعات وارد می کنه ثبت می کنه دوباره اطلاعات وارد می کنه ثبت می کنه و .... این اطلاعات میخوام تو لیست پایینی اش نشون داده بشه ولی تو بانک ذخیره نشه تا زمانیکه کاربر برای ثبت شدن در بانک دکمه "ثبت نهایی" رو میزنه. اونموقع همش با هم بره تو بانک ذخیره بشه.

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

ali_autumnal
شنبه 26 بهمن 1392, 16:13 عصر
اگه بخوای به کنترلر بفرستی از TempData میتونی استفاده کنی

در غیر اینصورت باید از JQuery کمک بگیری و دیتا هارو مثل یه تصویر Preview کنی یا دیتای ذخیره شده رو Hide کنی و بعد همه رو با هم به سرور ارسال کنی.

resident
شنبه 26 بهمن 1392, 16:46 عصر
اگه بخوای به کنترلر بفرستی از TempData میتونی استفاده کنی

در غیر اینصورت باید از JQuery کمک بگیری و دیتا هارو مثل یه تصویر Preview کنی یا دیتای ذخیره شده رو Hide کنی و بعد همه رو با هم به سرور ارسال کنی.

به نظرتون کدوم روش بهتره؟

امکانش هست نمونه کدشو بذارید ؟ آخه هیچ ذهنیتی در مورد کدی که باید بنویسم ندارم ....

مقادیر TempData از بین نمیره؟؟؟

ali_autumnal
شنبه 26 بهمن 1392, 18:03 عصر
من ارسال دیتا به سرور(ذخیره در دیتابیس) رو ترجیح میدم.

دیتای موجود در TempData تا زمانی که خوانده نشود پاک نخواهد شد مگر خود سرور از کش بندازه بیرون!

دیتای موجود پس از اولین بار که خوانده شد از حافظه پاک خواهد شد.

resident
یک شنبه 27 بهمن 1392, 11:58 صبح
من ارسال دیتا به سرور(ذخیره در دیتابیس) رو ترجیح میدم.

دیتای موجود در TempData تا زمانی که خوانده نشود پاک نخواهد شد مگر خود سرور از کش بندازه بیرون!

دیتای موجود پس از اولین بار که خوانده شد از حافظه پاک خواهد شد.

منم دوست داشتم تو بانک ذخیره کنم ولی خب نمیشه... چاره ای ندارم.

hakim22
یک شنبه 27 بهمن 1392, 13:12 عصر
برای حالت اولی که ارائه کردید بهترین راه استفاده از جاوا اسکریپت است ، مخصوصا اگر با Knockout آشنایی داشته باشید.

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

در هر صورت شما همیشه میتوانید اطلاعات را با ajax مستقیما بعد از وارد شده به سرور منتقل کنید. با استفاده از ajax.beginform کار خیلی ساده ای در پیش دارید.

resident
سه شنبه 29 بهمن 1392, 12:51 عصر
در صورتیکه بخوام اطلاعات رو تو session ذخیره کنم، چطور ارتباط بین اطلاعات وارد شده و اطلاعات اصلی رو برقرار کنم؟
اگر اطلاعات قبلا ثبت شده بود به عنوان قسمتی از key، آیدی فرد رو هم میدادم تا بتونم session اش رو پیدا کنم. اما وقتی کل اطلاعات رو دارم تازه وارد می کنم و آیدی در کار نیست، چطور این ارتباط رو برقرا کنم؟
در حالتی که بخوام برای یه فرد لیست ماشین هاشو ثبت کنم، باید آیدی فرد رو هم در key سشن نگه دارم. مثلا:
session["Carperson+PersonID"]
پیشنهاد دیگه ای دارید؟

hakim22
سه شنبه 29 بهمن 1392, 14:38 عصر
اگه حتما باید اول شخص ثبت بشه خب اول شخص رو ثبت کنید و آی دی اونو بدست بیاورید و سپس ماشین هاشو در سیستم ثبت کنید. با استفاده از ajax میتوانید با یک دکمه ی ثبت دو مدل رو در بانک ذخیره کنید

resident
سه شنبه 29 بهمن 1392, 16:37 عصر
اگه حتما باید اول شخص ثبت بشه خب اول شخص رو ثبت کنید و آی دی اونو بدست بیاورید و سپس ماشین هاشو در سیستم ثبت کنید. با استفاده از ajax میتوانید با یک دکمه ی ثبت دو مدل رو در بانک ذخیره کنید
حتما نباید اول شخص رو ثبت کرد بعدا ماشین ها رو ، ولی راه دیگه ای به نظر من نمیرسه.اتفاقا برای من بهتر بود همشونو با هم ثبت می کردم تو بانک ولی نمیدونم اگه آیدی شخص نباشه با چه روش دیگه ای می تونم مشخص کنم فلان سشن مربوط به کدوم شخصه، اونم شخصی که هنوز ثبت نشده و ...

resident
سه شنبه 29 بهمن 1392, 20:21 عصر
می تونم از Guid.NewGuid() برای گرفتن ID یونیک در سطح برنامه استفاده کنم؟
در حالت create با این متد، PersonID رو ست کنم و به ویو پاس بدم.

جایی خوندم از editorTemplate هم می تونم استفاده کنم

younesdoost
چهارشنبه 30 بهمن 1392, 00:06 صبح
سلام.از نظر من انجام این کار به صورت عدم ارسال Request چه بصورت آژاکس و چه صورت دیگه بهتره و با سرعت بالاتری انجام میشه و کاربر پسندتره.
پیشنهادم رو با یه مثال ارائه می دم:
فرض کنید شما یه لیستی از ماشینایی که گفتید رو دارید که می تونید به تعدادشون اضافه کنید و تو دیتابیس ذخیره کنید.
خب مرحله ی اول خوندن ماشینای قبلی از دیتابیس و لیست کردن اوناست:
public ActionResult Index()
{
return View(FetchedModels)
}

این تو ویو چی به ما میده؟:

<table>
<tr>
<th>CarId</th>
<th>Name</th>
</tr>
foreach(var item in Model)
{
<tr>
<td>@Html.DisplayFor(model=>model.CarId)</td>
<td>@Html.DisplayFor(model=>model.Name)</td>
</tr>
}
</table>

تا اینجا درست.
حالا کد های بالا رو با قسمت وارد کردن اطلاعات جدید و فرم ارسال اونها و کمی تغییرات بازنویسی می کنم:

<input type="text" id="carName"></input>
<button type="button" id="addCar"></button>
@using (Html.BeginForm("SaveNewCars"))
{
<table id="cars">
<tr>
<th>CarId</th>
<th>Name</th>
</tr>
foreach(var item in Model)
{
<tr>
<td>@Html.DisplayFor(model=>model.CarId)</td>
<td>@Html.DisplayFor(model=>model.Name)</td>
</tr>
}
</table>
<button type="submit">Save</button>
}

حالا ادامه ی کار:
تو مرحله ی بعد باید ویو مدل زیر رو بسازی که دارای ویژگی زیره:

public string Name{get;set;}

فرض کن اسم این ویو مدل رو AddedCarViewModel گذاشتیم.
تو مرحله ی بعد اون اکشنی که تو فرم داخل جدول که بالا دیدی کدش رو،رو می سازیم:

[HttpPost]
public ActionResult SaveNewCars(List<AddedCarViewModel> newCars)
{
foreach(var car in newCars)
{
Save(car);
}
return RedirectToAction("Index")
}


حالا فقط گام آخر می مونه که یه تیکه کد جی کوئری هستش.می خوایم وقتی رو دکمه با آی دی addCar کلیک شد مقدار داخل تکست باکس با آی دی carName رو هم به جدول اضافه کنه هم یه آبجکت از جنس AddedCarViewModel براش بسازه که بهمراه فرم با زدن دکمه ی Save ارسال بشه.
اول ردیف جدول رو می سازیم:

$("#addCar").on("click",function()
{
var carId=parseInt($("#cars").children().last().children().first().html())+1;
var carName=$("#carName").val();
var element="<tr><td>"+carId+"</td><td>"+carName+"</td></tr>
$("#cars").append(element)
});


حالا کد بالا رو بازنویسی می کنم و کدهای ایجاد آبجکت رو بهش اضافه می کنم:

var i=0;
$("#addCar").on("click",function()
{
var carId=parseInt($("#cars").children().last().children().first().html())+1;
var carName=$("#carName").val();
var element="<tr><td>"+carId+"</td><td>"+carName+"<input type='hidden' name='newCars["+i+"].Name' value='"+carName+"'></input></td></tr>
$("#cars").append(element)
i++;
});

تموم شد.حالا وقتی دکمه ماشین جدید رو که می زنی یه ردیف به جدول اضافه می شه و همچنین داری یه لیستی از newCars رو هم می سازی که دارای پراپرتی های نام مختلف هستش و وقتی Save اصلی رو می زنی این لیست رو پاس میدی به اون اکشنی که منتظر یک لیستی از AddedCarViewModel با نام newCars هستش و اونجا هم تک تک اون لیست رو ذخیره می کنی.
از طولانی شدن جواب معذرت می خوام.
اگه سوالی داشتی در مورد پیاده سازیش خوشجال میشم جواب بدم.

resident
سه شنبه 06 اسفند 1392, 19:49 عصر
جناب یونس دوست ممنون از اینکه با صبر و حوضله ی زیاد پاسخ دادید...
مشکلم داره حل میشه...
خواستم در جریان باشید که دارم روش کار می کنم.. سوالی پیش بیاد ازتون می پرسم
امیدوارم همیشه موفق و سربلند باشید

younesdoost
چهارشنبه 07 اسفند 1392, 23:38 عصر
سلام.
نمونه ی زیر رو براتون گذاشتم.
3 تا فولدر کنترلر و ویو و مدل رو می تونید دانلود کنید و ببینید.
http://upir.ir/files92be/51ae300cdf991.zip

Amir Oveisi
پنج شنبه 08 اسفند 1392, 01:15 صبح
پیشنهاد میکنم این لینک رو مطالعه کنید،http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

resident
یک شنبه 11 اسفند 1392, 19:37 عصر
ممنون از همه ی دوستان علی الخصوص جناب یونس دوست
مشکلم حل شد

resident
پنج شنبه 15 اسفند 1392, 11:54 صبح
یه سوال : validation لیست ماشینها چطور انجام میشه؟ فرض کنید کاربر دکمه جدید رو زده و بعد بدون اینکه اطلاعاتی وارد کرده باشه دکمه ذخیره رو میزنه(یعنی لیست خالیه)...
با فرض اینکه ورود حداقل یک ماشین الزامیه، چطور باید این مورد بررسی بشه؟