PDA

View Full Version : مشکل در بارگزاری فایل در فرم



پروگرامنویس
پنج شنبه 19 مرداد 1396, 10:46 صبح
درود
من تو این فرم با input-file دوتا مشکل دارم/
1-وقتی فایلی رو در فرم آپلود مبکنم و روی سابمیت کلیک میکنم نام فایل مورد نظر بدرستی در جدول ذخیره میشه اما خود فایل در دایکتوری تعیین شده بارگزاری نمیشه/برک پوینت که گذاشتم فهمیدم هنگام پست شدن فرم پارامتر " HttpPostedFileBase file" در اکشن نال هستش!هرکاری هم کردم درست نشد.با توجه به کدهایی که زدم لطفا بگید ایراد کار کجاست؟(اینم بگم با اینکه تو ویو صراحتا برای input-file فرم مقدار name="file" رو تعریف کردم اما وقتی تو مرورگر inspect element میگیرم نامش همون FileUpload نوشته میشه.)
2-برنامه رو طوری نوشتم که تنها وقتی کاربر گزینه "درخواست درج آگهی" در DropDownList فرم رو انتخاب کرد input-file فرم فعال باشه و درغیر اینصورت غیرفعال بمونه.خب تااینجا درست کار میکنه مشکلم با ولیدیشن مربوط به این ورودیه که حتی وقتی هم غیرفعاله بازم اجازه پست شدن به رم رو نمیده!چیکار باید بکنم تا وقتی input-file غیر فعاله ولیدیشن اونم دیگه کار نکنه؟
سپاس
کد ویوی فرم


<div class="col-md-12 order_tell">
@using (Html.BeginForm("TellUs", "Home",
FormMethod.Post ,new { @class = "form-horizontal box_new_cmnt", enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="row r_cmnt">
<div class="col-md-12 lbl_frm">
@Html.LabelFor(m => m.Subject)
</div>
</div>
<div class="row r_cmnt">
<div class="col-md-6 box_validation">
@Html.ValidationMessageFor(model => model.Subject, "", new { @class = "text-danger" })
</div>
<div class="col-md-6 inpt_frm">
@Html.DropDownListFor(model => model.Subject,
new List<SelectListItem>
{
new SelectListItem() {Text="سفارش پروژه",Value="prj"},
new SelectListItem() {Text="درخواست درج آگهی",Value="agh"},
new SelectListItem() {Text="دیگر ...",Value="otr"}
}
, "انتخاب", new { @class = "form-control", id = "lst_tell", onchange = "visibleFile()" })
</div>
</div>
<div class="row r_cmnt">
<div class="col-md-12 lbl_frm">
@Html.LabelFor(m => m.Email)
</div>
</div>
<div class="row r_cmnt">
<div class="col col-md-6 box_validation">
@Html.ValidationMessageFor(model => model.Email, "", new { @class = "text-danger"})
</div>
<div class="col-md-6 inpt_frm">
@Html.TextBoxFor(model => model.Email, "", new { id = "eml" })
</div>
</div>
<div id="div_file">
<div class="row r_cmnt">
<div class="col-md-12 lbl_frm">
@Html.LabelFor(m => m.FileUploud)
</div>
</div>
<div class="row r_cmnt">
<div class="col col-md-6 box_validation">
@Html.ValidationMessageFor(model => model.FileUploud, "", new { @class = "text-danger" })
</div>
<div class="col-md-6 inpt_frm">
@Html.TextBoxFor(model => model.FileUploud, null, new { type = "file",@name="file", id = "up_tell", disabled = "disabled" })
</div>
</div>
</div>
<div class="row r_cmnt">
<div class="col-md-12 lbl_frm">
@Html.LabelFor(m => m.Body)
</div>
</div>
<div class="row r_cmnt">
<div class="col col-md-4 box_validation">
@Html.ValidationMessageFor(model => model.Body, "", new { @class = "text-danger" })
</div>
<div class="col-md-8 inpt_frm">
@Html.TextAreaFor(model => model.Body, new { rows = "10" })
</div>
</div>

<div class="row r_cmnt">
<div class="col-md-12 btn_frm">
<button type="submit">درج پیام</button>
</div>
</div>
}
</div>
//javascript
<script src="~/Scripts/jquery-1.10.2.min.js"></script>
<script src="~/Scripts/jquery.validate.min.js"></script>
<script src="~/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script type="text/javascript">
$(function () {
$("#lst_tell").change(function () {
if ($(this).val() == "agh") {
$("#up_tell").removeAttr('disabled');
$("#up_tell").removeAttr('data-valmsg-for');
} else {
$("#up_tell").attr('disabled', "disabled");
$("#val_up").attr('data-valmsg-for', "FileUploud");
}
});
});
</script>

کد اکشن


[HttpGet]
public ActionResult TellUs()
{
return View();
}
[HttpPost]
public ActionResult TellUs(HttpPostedFileBase file,
[Bind(Include = "ID,Subject,Email,Body,FileUploud,Date,Time,State")] Message message)
{
if (ModelState.IsValid)
{
if (file != null && file.ContentLength > 0)
{
message.FileUploud = file.FileName;
string strPath = "~/Content/Images/ads"+ file.FileName;
string strFinal = Server.MapPath(strPath);
file.SaveAs(strFinal);
db.Messages.Add(message);
db.SaveChanges();
}
else
{
db.Messages.Add(message);
db.SaveChanges();
}
}
return View();
}

Moien Tajik
جمعه 20 مرداد 1396, 19:42 عصر
کدتون کمی طولانی هست ، برای همینه که دیر جواب میگیرید .

برای سوال اولتون ، دلایل مختلفی میتونه وجود داشته باشه که یکیش رو خودتون اشاره کردید که Name در FileUpload میشه ; برای این مورد بجای TextboxFor Helper یک input از نوع فایل بزارید و name اون رو file بزارید و تست کنید .
طبق این آموزش هم عمل کنید تا مطمئن بشید مراحل رو بدرستی پیش رفتید : http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx/

در مورد سوال دوم هم ، سمت Controller باید این مورد رو مدیریت کنید .

پروگرامنویس
شنبه 21 مرداد 1396, 19:31 عصر
کدتون کمی طولانی هست ، برای همینه که دیر جواب میگیرید .

برای سوال اولتون ، دلایل مختلفی میتونه وجود داشته باشه که یکیش رو خودتون اشاره کردید که Name در FileUpload میشه ; برای این مورد بجای TextboxFor Helper یک input از نوع فایل بزارید و name اون رو file بزارید و تست کنید .
طبق این آموزش هم عمل کنید تا مطمئن بشید مراحل رو بدرستی پیش رفتید : http://haacked.com/archive/2010/07/16/uploading-files-with-aspnetmvc.aspx/

در مورد سوال دوم هم ، سمت Controller باید این مورد رو مدیریت کنید .

سپاس
مشکل اول برطرف شد همونطور که شما گفتید از input استفاده کردم.
اما برای پرسش دوم: یعنی نمیشه سمت کلاینت با متد دستی جی کوئری این کار رو کرد .من از صبح دارم تلاش میکنم تو صفحه یه متد جی کوئری بنویسم که وقتی کاربر سابمیت میکنه :دوتا شرط رو چک کنه که اگه آیتم agh تو دراپ داون انتخاب بود و input-file هم نال بود یه المنت اسپن که توش اخطار رو نوشتم از حالت هیدن دربیاد و فرم هم پست نشه/ولی هرچی ور میرم اصلا تابع اجرا نمیشه.
تاکیدم روی جی کوئری واسه اینکه اگه سمت کلاینت بتونم اینکار رو کنم بهره وری بهتری داره. درسته؟
یکی از فانکشن هایی که امتحان کردم اینه:


<script type="text/javascript">
//فانکشن ولیدیشن برای بارگزاری فایل
$(document).ready(function(){
$("#btn").submit(function () {

if ($("lst_tell").val == "agh" && $("#up_tell").val == null) {
$("#val_fle").removeAttr("hidden");
return false;
}
});

});
//فانکشن فعال یا غبرفعال کردن اینپوت-فایل با توجه به آیتم انتخابی دراپ داون لیست
$("#lst_tell").change(function () {
if ($(this).val() == "agh") {
$("#up_tell").removeAttr('disabled');
$("#up_tell").removeAttr('data-valmsg-for');
} else {
$("#up_tell").attr('disabled', "disabled");
$("#val_up").attr('data-valmsg-for', "FileUploud");
}
});
</script>

Moien Tajik
شنبه 21 مرداد 1396, 20:04 عصر
سمت کلاینت این رو بخواید مدیریت کنید خیلی راحت میشه Bypass کردش و بقولی " پیچوندش " چون کد سمت کاربر هستش .
برای همین هست که شما برای Property های مدلتون Data Annotation میزارید تا هم سمت سرور و هم سمت کلاینت Validation انجام بشه .

یه Package هستش به اسم Fool Proof که شما میتونید باهاش Conditional Validation رو انجام بدید ، یعنی بر اساس مقدار فیلد دیگه یک Validation در سمت سرور اعمال بشه .
فکر میکنم بتونه چیزی که میخواید رو براتون فراهم کنه : https://foolproof.codeplex.com/

پروگرامنویس
یک شنبه 22 مرداد 1396, 12:10 عصر
سپاس واسه پشنهاد پکیج
اما راستش من منشاء اجرا نشدن فانکشن مورد نظر رو پیدا کردم که اگه حل بشه گمون نکنم نیاز به بکارگیری پکیج داشته باشم/تو فانکشن وقتی شرط رو حذف میکنم دستورهای درونش بدرستی اجرا میشه(اسپن #val_fle نشون داده میشه و فرم هم پست نمیشه) اما همین که شرط رو برمیگردونم باز متد مورد نظر اجرا نمیشه!پس مشکل از نادیده گرفته شدن شروط هست /نمیدونم چرا شروط رو نادیده میگره.حتی من شروط رو بروش زیر از هم جدا کردم ولی بزم فایده نداشت .بیزحمت شما یه نگاه بندازید ببینید می تونید مشکل رو پیدا کنید.درضمن بجای ایونت سابمیت باتن اینبار از سابمیت خود فرم استفاده کردم


$(document).ready(function(){
$("#frm").submit(function () {

if ($("#lst_tell").val == "agh") {
if ($("#up_tell").val == null || $("#up_tell").val=="") {
$("#val_fle").removeAttr("hidden");
alert("error");
return false;
}
}
});

Moien Tajik
یک شنبه 22 مرداد 1396, 17:47 عصر
وقتی کد js مینویسید همیشه از Console.log استفاده کنید تا ببینید مقدار متغییرتون چی هست .

فکر میکنم مشکل شما از این شرط هستش :
if ($("#lst_tell").val == "agh")

برای گرفتن آیتم انتخاب شده در Dropdown از این کد استفاده کنید :

var currentDropdownValue = $('#lst_tell').find(":selected").val();




if (currentDropdownValue == "agh") {
if ($("#up_tell").val == null || $("#up_tell").val == "") {
$("#val_fle").removeAttr("hidden");
alert("error");
return false;
}
}


https://stackoverflow.com/a/10659117

پروگرامنویس
دوشنبه 23 مرداد 1396, 13:17 عصر
وقتی کد js مینویسید همیشه از Console.log استفاده کنید تا ببینید مقدار متغییرتون چی هست .

فکر میکنم مشکل شما از این شرط هستش :
if ($("#lst_tell").val == "agh")

برای گرفتن آیتم انتخاب شده در Dropdown از این کد استفاده کنید :

var currentDropdownValue = $('#lst_tell').find(":selected").val();




if (currentDropdownValue == "agh") {
if ($("#up_tell").val == null || $("#up_tell").val == "") {
$("#val_fle").removeAttr("hidden");
alert("error");
return false;
}
}


https://stackoverflow.com/a/10659117

بازم درست نشد!! :اشتباه:از روش شما برای بدست آوردن آیتم دراپ استفاده کردم با کنسول نتونستم مقدار آیتم انتخابی رو ببینم ولی گذاشتمش درون alert() .خنده دار اینجاست که توی آلرت دقیقا مقدار agh رو نشون میده ولی بازم شرط عمل نمیکنه.دیگه دیوونم کرده :افسرده: با این حال سپاس از راهنمایی هاتون

پروگرامنویس
دوشنبه 23 مرداد 1396, 13:45 عصر
سرانجام یه جوری درستش کردم !بجای if از switch استفاده کردم و جواب داد:لبخندساده: یکم زیاده روی ولی خدایی خیلی ذوق کردم چون 4-5 روزه سر این ایاد کوچیک بد مخم درگیر بود/البته با راهنمایی های شما
حالا با این تفاسیر نظرتون راجع به کدهایی که واسه این منظور نوشتم چیه ؟خوب هست یا نه؟
اسکریپت نهایی شاید کسایی مشکل من رو داشته باشند و ازش بخوان استفاده کنن


<script type="text/javascript">
//فانکشن ولیدیشن برای بارگزاری فایل
$(document).ready(function(){
$("#frm").submit(function () {
var x = $('#lst_tell').find(":selected").val();
var a = $('#up_tell').first().val();
switch(x)
{
case 'agh':
if (a== null || a=="") {
$("#val_fle").removeAttr("hidden");
return false;
break;
}
}
});
});
//فانکشن فعال یا غبرفعال کردن اینپوت-فایل با توجه به آیتم انتخابی دراپ داون لیست
$("#lst_tell").change(function () {
if ($(this).val() == "agh") {
$("#up_tell").removeAttr('disabled');
$("#up_tell").removeAttr('data-valmsg-for');
} else {
$("#up_tell").attr('disabled', "disabled");
$("#val_up").attr('data-valmsg-for', "FileUploud");
}
});
</script>