PDA

View Full Version : ثبت همزمان داده ها



alireza_rashvand
چهارشنبه 24 تیر 1394, 11:01 صبح
با سلام
يك پروژه دانشگاهی در نظر بگیرید.

فرض بگیریم که در صفحه ای قصد داریم کلاس ثبت و برای هر کلاس روز های برگزاری مشخص کنیم.

با فرض اینکه بخواهیم در همان صفحه هم کلاس و هم روزهای (تعداد نامعلوم) رو با یک کلیک ثبت کنیم چند سوال.

1- مدل ارسالی به ویو چگونه است؟
ایا باید یک ویو مدل(ViewClass) از دو مدل کلاس(Class) و روزهای کلاس(ClassDays) بسازیم؟
مثلا:


public class Class
{
public string Info { get; set; }
}
public class ClassDays
{
public DayOfWeek days { get; set; }
public DateTime StartTime { get; set; }
public DateTime EndTime { get; set; }
}
public class ViewClass
{
public string ClassInfo { get; set; }
public List<ClassDays> ClassDays { get; set; }
}




2- در طراحی ویو باید چطور عمل کنیم؟
تا بتونیم:
- هم اطلاعات کلاس و هم اطلاعات روزکلاس رو برای اکشن بفرستیم بگیره و ثبت کنه
- هم به صورت داینامیک بتونیم هر چه قدر خواستیم روز ثبت کنیم

niloo17
چهارشنبه 24 تیر 1394, 13:12 عصر
1. شما 2 تا کلاس دارید. کلاس دوره ها و روزهای دوره ها. در طراحی مدل دوره ها باید لیستی از روزهای دوره ها را اضافه کنید و همین مدل به View ارسال می کنیم.

2. برای ایجاد/ویرایش کلاس ها به یک View با یک PartialView احتیاح دارید که Partial را به صورت زیر تعریف می کنید.


@using (Html.BeginCollectionItem("ClassDays"))
{}

alireza_rashvand
چهارشنبه 24 تیر 1394, 13:31 عصر
1. شما 2 تا کلاس دارید. کلاس دوره ها و روزهای دوره ها. در طراحی مدل دوره ها باید لیستی از روزهای دوره ها را اضافه کنید و همین مدل به View ارسال می کنیم.

2. برای ایجاد/ویرایش کلاس ها به یک View با یک PartialView احتیاح دارید که Partial را به صورت زیر تعریف می کنید.


@using (Html.BeginCollectionItem("ClassDays"))
{}


به نظرم شما به این جمله م خوب توجه نکردید:
با فرض اینکه بخواهیم در همان صفحه هم کلاس و هم روزهای (تعداد نامعلوم) رو با یک کلیک ثبت کنیم چند سوال

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

niloo17
چهارشنبه 24 تیر 1394, 13:47 عصر
منظور منم همین بود شما یک View طراحی می کنید که شامل فیلدهای کلاس + یک PartialView + دکمه ای برای اضافه کردن داینامیک روزها(به صورت جاوا اسکریپت Partial جدید New می نید.) است مدل ارسالی به View همون کلاس می باشد.


Partial به صورت زیر طراحی می کنید .(دکمه Delete برای حدف روزها)


<div class="form-group">
@using (Html.BeginCollectionItem("ClassDays"))
{
فیلدهای مورد نظر + یک فیلد محفی برای ClassId


<a href="#" class="btn btn-danger btn-xs deleteRow" style="margin-top: 5px;"><i class="icon-trash "></i></a>

}
</div>

alireza_rashvand
چهارشنبه 24 تیر 1394, 14:09 عصر
سپاس از نظرتان.
پس اگر منظورتان همان باشه احتمالا من اشتباه کردم بنابرین می پردازم به گفته شما تا موضوع روشن بشه.

در ابتدا لطفا BeginCollectionItem رو توضیح بدید یاد بگیرم.

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

در ویو هم یک دکمه می ذارم و به صورت داینامیک فرم روزهای تشکیل کلاس رو می سازیم.
(سه فیلد نام روز, ساعت شروع, ساعت پایان)

فرض بگیریم با دوبار فراخوانی PartialView دو تا فرم روز ساختیم و کاربر هم انها را پر کرده.


سوالی که برام پیش اومده اینکه وقتی دکمه ارسال رو می زنیم امضای اکشن برای گرفتن مدل و پارامتر های داینامیک به چه صورتیه؟


[HttpPost]
public virtual ActionResult Create(؟)


فراموش نکنید که قبل از زدن دکمه ارسال , هنوز نه کلاسی ثبت شده نه روزهای اون کلاس و قراره وقتی دکمه ارسال زده شد هر دو کار انجام بشه
(بنابرین هم باید مدل کلاس رو اکشن بگیره هم تمام روزهایی که به صورت داینامیک ساخته و کاربر ان رو پر کرده)

niloo17
پنج شنبه 25 تیر 1394, 08:51 صبح
در مورد BeginCollectionItem می تونید https://www.nuget.org/packages/BeginCollectionItem/ ببینید.

مدل ارسالی شما همان کلاس است که لیستی از روزها راداره .
همونطور که گفتید در ویو با استفاده از جاوااسکریپت به صورت داینامیک PartialView ها را لود می کنید.
امضای اکشن شما هم همان مدل ارسالی به ویو می باشد. (وقتی BeginCollectionItem استفاده می کنید لیست روزها را به همراه مدل دارید ). پس هنگام ثبت یک مدل از کلاس+ لیستی از روزها را داریئ که ثبت می کنید .
ببخشید وقت نداشتم که یک مثال براتون بذارم . می تونید از این لینک کمک بگیرید .
http://stackoverflow.com/questions/29774822/mvc-5-begincollectionitem-with-partial-crud

alireza_rashvand
شنبه 27 تیر 1394, 23:53 عصر
لطفا در مورد BeginCollectionItem بیشتر توضیح بدید متاسفانه متوجه نشدم.

راهی که خودم پی گرفتم:

استفاده از کد زیر برای ایجاد فرم ثبت روز ها به صورت داینامیک:

<script>
$('#newDays').click(function () {
$('#loadingClassDay').show()
$.ajax({
url: '@Url.Action(... )',
success: function (data) {
$('#loadingClassDay').hide()
$("#ClassDays").append(data)
}
});
});
</script>


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

public virtual ActionResult Create(Class model,
string[] days,
string[] StartTime,
string[] EndTime)


وقتی دکمه ارسال زده می شه همه input هایی که اسم StartTime دارند به صورت لیستی برگردانده می شه.

بنابرین با زدن دکمه ارسال هم مدل کلاس و هم لیستی از مقادیر کلاس (روز هفته , ساعت شروع و ساعت پایان) رو داریم و می تونیم هر عملی خواستیم در اکشن انجام بدیم.

البته چند مشکلی جزئی دارم از جمله اعتبار سنجی , input هاي هم نام.... ولی در کل کارم رو راه می اندازه.