View Full Version : سوال: ارسال اطلاعات از ویو به اکشن
Black_Hammer
سه شنبه 11 آبان 1395, 09:52 صبح
سلام دوستان یه سوال داشتم ممنون می شم پاسخ بدین
من توی ویوی خودم می خوام یه اسکریپت بزار که وقتی کاربر روی یه کلید کلیک کرد به تعداد کلیک هاش یک مثلا تکس باکس جدید اضافه بشه . من توی اکشن خودم هم یک list<> جنریک دارم که از نوع یک کلاس می باشد و چند تا پارامتر دیگه که باید پر بشن سوال من اینه که چطور می تونم اطلاعات اون تکس باکس ها را دونه دونه و جدا از هم به لیست خودم اضافه کنم .
من از viewModel استفاده می کنم تا اطلاعات خودم رو به ویو ارسال کنم و می خوام که از روش :binede استفاده کنم برای دریافت اطلاعات خود توی اکشن . آیا این کار شدنی ؟ اگه بله چطور ممکنه؟
اگه هم شدنی نیست لطفا روش صحیح پر کردن یک لیست از نوع جنریک رو توی اکشن به من توضیح بدید خیلی ممنون از کمکتون.
parsdarab
سه شنبه 11 آبان 1395, 21:17 عصر
اره شدنیه
کدی که به صورت داینامیک هست باید با جی کوئری بنویسی
برای اینکه داده ها بایند بشه در اکشن باید هم نام با متغیر باشد البته با یک تفاوت که یک ایندکس هم داره
برای نمایش داده ها در حالت ویرایش از این کد استفاده کن
for (var i = 0; i < Model.tempBasePersonelActivity.Count(); i++) {
<div id="divActivity@(i)" class="row">
<div class="col-lg-3">
@Html.HiddenFor(m => Model.tempBasePersonelActivity[i].Id, new { @class = "ActivityField1" })
</div>
<div class="col-lg-3">
@Html.DropDownListFor(m => Model.tempBasePersonelActivity[i].ActivityId, new SelectList(ViewBag.Activity, "Value", "Text", Model.tempBasePersonelActivity[i].ActivityId), new { @class = "ActivityField2 form-control" })
</div>
<div class="col-lg-3">
@Html.TextBoxFor(m => Model.tempBasePersonelActivity[i].Caption, new { @class = "ActivityField3 form-control" })
</div>
<div class=" controls">
<input value="حذف" name='btnDelete@(i)' id='btnDelete@(i)' onclick="removeRowActivity(@(i))" class="btn btn-default" type="button">
</div>
</div>
}
کد برای اضافه کردن تکس باکس به صورت داینامیک
$("#" + divName).append('<div class="col-lg-3 controls"><input type="hidden" value="' + activityId + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityId" class = "ActivityField1"></div>');
parsdarab
سه شنبه 11 آبان 1395, 21:31 عصر
خروجی نهایی
143279
parsdarab
سه شنبه 11 آبان 1395, 21:32 عصر
از گراف دیف برای ذخیره تغییر ات در بانک اطلاعاتی استفاده کن
Black_Hammer
چهارشنبه 12 آبان 1395, 01:45 صبح
اره شدنیه
کدی که به صورت داینامیک هست باید با جی کوئری بنویسی
برای اینکه داده ها بایند بشه در اکشن باید هم نام با متغیر باشد البته با یک تفاوت که یک ایندکس هم داره
برای نمایش داده ها در حالت ویرایش از این کد استفاده کن
for (var i = 0; i < Model.tempBasePersonelActivity.Count(); i++) {
<div id="divActivity@(i)" class="row">
<div class="col-lg-3">
@Html.HiddenFor(m => Model.tempBasePersonelActivity[i].Id, new { @class = "ActivityField1" })
</div>
<div class="col-lg-3">
@Html.DropDownListFor(m => Model.tempBasePersonelActivity[i].ActivityId, new SelectList(ViewBag.Activity, "Value", "Text", Model.tempBasePersonelActivity[i].ActivityId), new { @class = "ActivityField2 form-control" })
</div>
<div class="col-lg-3">
@Html.TextBoxFor(m => Model.tempBasePersonelActivity[i].Caption, new { @class = "ActivityField3 form-control" })
</div>
<div class=" controls">
<input value="حذف" name='btnDelete@(i)' id='btnDelete@(i)' onclick="removeRowActivity(@(i))" class="btn btn-default" type="button">
</div>
</div>
}
کد برای اضافه کردن تکس باکس به صورت داینامیک
$("#" + divName).append('<div class="col-lg-3 controls"><input type="hidden" value="' + activityId + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityId" class = "ActivityField1"></div>');
سلام و ممنون از راهنمایی شما من متوجه نشدم آیا منظورتون این بود که اکشن خودمون باید هم نام با او لیستی باشه که می خوایم به صورت داینامیک مقدار دهی کنیم باید باشه؟
و این گراف دیف هم نمی دونم چیه میشه لطف کنید و بیشتر توضیح بدین .
:گریه::گریه::گریه::گریه:من نفهمیدم چی گفتین:گریه::گریه::گریه::گریه:
Black_Hammer
چهارشنبه 12 آبان 1395, 02:10 صبح
از گراف دیف برای ذخیره تغییر ات در بانک اطلاعاتی استفاده کن
بنده دارم از sql server و entityframework استفاده می کنم می شه بفرمایید گراف دیف چیست؟:کف:
parsdarab
پنج شنبه 13 آبان 1395, 18:20 عصر
در مورد گراف دیف میتونید این رو مطالعه کنی
http://www.dotnettips.info/post/1860/%D8%A8%D9%87-%D8%B1%D9%88%D8%B2-%D8%B1%D8%B3%D8%A7%D9%86%DB%8C-%D8%B3%D8%A7%D8%AF%D9%87%E2%80%8C%D8%AA%D8%B1-%D8%A7%D8%AC%D8%B2%D8%A7%D8%A1-%D8%A7%D8%B1%D8%AA%D8%A8%D8%A7%D8%B7%D8%A7%D8%AA-%D8%AF%D8%B1-ef-code-first-%D8%A8%D9%87-%DA%A9%D9%85%DA%A9-graphdiff
parsdarab
پنج شنبه 13 آبان 1395, 18:22 عصر
فرض کنید همچین کلاسی هست
public sealed class BasePersonel
{
[NotMapped]
[Display(Name = "نوع فعالیت")]
public int? ActivityId { get; set; }
[NotMapped]
public string ActivityCaption { get; set; }
[NotMapped]
public List<BasePersonelActivity> tempBasePersonelActivity { get; set; }
public ICollection<BasePersonelActivity> BasePersonelActivitys { set; get; }
}
که فیلد ActivityId و ActivityCaption برای داده هایی که کاربر وارد میکنه بعد روی دکمه اضافه کلیک می کنه که باید به صورت دینامیک فیلد هایی بسازه که بعدا این فیلد ها به صورت اتوماتیک به لیستی که در اکشن هست انتساب داده میشه برای انتصاب اتوماتیک باید idو name اون فیلد هایی که به صورت داینامیک ساخته میشه درست بنویسی
برای این مثل به این صورت میشه
$("#" + divName).append('<div class="col-lg-3 controls"><input type="hidden" value="' + activityId + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityId" class = "ActivityField1"></div>'); $("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + activityStr + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityStr" class = "ActivityField2 form-control"></div>');
$("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + captionActivity + '" name="tempBasePersonelActivity[' + (iActivity) + '].Caption" class = "ActivityField3 form-control"></div>');
این باعث میشه اون فیلدهایی که به صورت داینامیک ساخته میشه به لیست tempBasePersonelActivity منتصب بشه
Black_Hammer
جمعه 14 آبان 1395, 18:03 عصر
فرض کنید همچین کلاسی هست
public sealed class BasePersonel
{
[NotMapped]
[Display(Name = "نوع فعالیت")]
public int? ActivityId { get; set; }
[NotMapped]
public string ActivityCaption { get; set; }
[NotMapped]
public List<BasePersonelActivity> tempBasePersonelActivity { get; set; }
public ICollection<BasePersonelActivity> BasePersonelActivitys { set; get; }
}
که فیلد ActivityId و ActivityCaption برای داده هایی که کاربر وارد میکنه بعد روی دکمه اضافه کلیک می کنه که باید به صورت دینامیک فیلد هایی بسازه که بعدا این فیلد ها به صورت اتوماتیک به لیستی که در اکشن هست انتساب داده میشه برای انتصاب اتوماتیک باید idو name اون فیلد هایی که به صورت داینامیک ساخته میشه درست بنویسی
برای این مثل به این صورت میشه
$("#" + divName).append('<div class="col-lg-3 controls"><input type="hidden" value="' + activityId + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityId" class = "ActivityField1"></div>'); $("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + activityStr + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityStr" class = "ActivityField2 form-control"></div>');
$("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + captionActivity + '" name="tempBasePersonelActivity[' + (iActivity) + '].Caption" class = "ActivityField3 form-control"></div>');
این باعث میشه اون فیلدهایی که به صورت داینامیک ساخته میشه به لیست tempBasePersonelActivity منتصب بشه
دوست عزیز میشه محبت کنی و این پروژه ای که اینو توش نوشتی رو هم بزاری اینجا . شرمنده ولی من یه مقدار تازه کار می باشم و سخت متوجه می شم
parsdarab
جمعه 14 آبان 1395, 21:22 عصر
شرمندتم
400 مگ هست
hp1361
چهارشنبه 18 اسفند 1395, 11:28 صبح
سلام
ممکنه کاربر بعضی از فیلدها رو حذف و بعضی فیلدهای جدید در بین فیلدهای قبلی اضافه کنه.
اگر ترتیب فیلدها برای ما مهم باشه، چطوری این ترتیب رو دریافت و ذخیره کنیم؟
parsdarab
چهارشنبه 18 اسفند 1395, 13:42 عصر
سلام
میباست id و name رو آپدیت کنید
hp1361
چهارشنبه 18 اسفند 1395, 14:06 عصر
سلام
میباست id و name رو آپدیت کنید
مشکل من نحوه یافتن id و name هسته در زمانیکه کاربر هر کدوم رو ممکنه حذف کنه.
اگر با یک مثال راهنمایی بفرمائید ممنون میشم
parsdarab
چهارشنبه 18 اسفند 1395, 22:01 عصر
سمت سرور یا کلاینت؟
سیستمی که من کار کردم به این صورته که ابتدا کاربر در سمت کلاینت میاد اون مجموعه ای رو که میخاد رو میسازه.
حالا ممکنه در این بین بخواد یکی از اون ردیف ها رو از ابتدا وسط یا انتها حذف کنه.
اگر از ابتدا حذف کنه باید فیلدهای بعدی رو اپدیت کنه id و name . چرا آپدیت کنه؟ چون اگر اپدیت نشه در سمت سرور اون مجموعه در لیست بایند نمیشه.
همین طور اگر بخواهد از وسط این مجموعه حذف کنه.
در اینجا ممنطورم از اپدیت یعنی بایذ با کد جی کوئری id و name رو بگیره و به صورت
tempBasePersonelActivity[i].Caption عمل کنید.
که در اینجا متغیر i یک کانتر می باشه.
وقتی که شما به این صورت مقدار دهی idو name رو انجام میدید موقع ارسال اطلاعات به سرور
این مقداری که داخل این تکس باکس ها هستند سریالیز میکنه و میفرسته سمت سرور و در سمت سرور دیسریالیز میشه و به اون لیست انتسای داده میشه.
البته عملیات سریالیز و دیسریالیز به صورت اتوماتیک انجام میشه.
فقط تا جایی که اون کانتر مقدارش پشت سر هم باشه
hp1361
سه شنبه 08 فروردین 1396, 10:57 صبح
سلام
اگر ممکنه تابع حذف جیکوئری رو هم بزارید.
ممنون
parsdarab
سه شنبه 08 فروردین 1396, 23:41 عصر
//add div and filed
function addRowActivity(activityId, activityStr, captionActivity) {
//debugger
iActivity++;
var divName = 'divActivity' + iActivity;
$("#partActivity").append('<div id=' + divName + ' class="row"></div>');
//debugger
//http://stackoverflow.com/questions/18065668/jquery-and-html-textboxfor
$("#" + divName).append('<div class="col-lg-3 controls"><input type="hidden" value="' + activityId + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityId" class = "ActivityField1"></div>');
$("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + activityStr + '" name="tempBasePersonelActivity[' + (iActivity) + '].ActivityStr" class = "ActivityField2 form-control"></div>');
$("#" + divName).append('<div class="col-lg-3 controls"><input type="text" value="' + captionActivity + '" name="tempBasePersonelActivity[' + (iActivity) + '].Caption" class = "ActivityField3 form-control"></div>');
//http://stackoverflow.com/questions/7707074/creating-dynamic-button-with-click-event-in-javascript
var element = document.createElement("input");
//Assign different attributes to the element.
element.type = 'button';
element.value = 'حذف'; // Really? You want the default value to be the type string?
element.name = ''; // And the name too?
element.className = 'btn btn-default';
element.onclick = //removeRowActivity
function removeRowActivity() { // Note this is a function
//debugger
$("#" + divName).remove();
iActivity--;
updateActivity();
};
$("#" + divName).append(element);
}
function updateActivity() {
//debugger
//http://stackoverflow.com/questions/29864980/how-to-bind-list-of-objects-in-asp-net-mvc-when-one-item-in-between-is-deleted
$(".ActivityField1").each(function (iTemp) {
$(this).prop('name', "tempBasePersonelActivity[" + iTemp + "].Id");
});
$(".ActivityField2").each(function (iTemp) {
$(this).prop('name', "tempBasePersonelActivity[" + iTemp + "].ActivityId");
});
$(".ActivityField3").each(function (iTemp) {
$(this).prop('name', "tempBasePersonelActivity[" + iTemp + "].Caption");
});
}
hp1361
چهارشنبه 09 فروردین 1396, 08:57 صبح
ممنون بابت پاسخگویی
گویا GraphDiff برای EF Core ارائه نشده. نویسنده ش برای جایگذینش Detached رو که خودش تهیه کرده معرفی کرده.
اما برای MVC مثالی نزاشته و مشخص نیست چطور باید باهاش کار کرد.
شما جایگزین یا مثال از همین Detached سراغ ندارین؟
ممنون
parsdarab
چهارشنبه 09 فروردین 1396, 09:19 صبح
من هنوز به سمت ef core نرفتم
:متفکر:
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.