سلام وقت بخیر،
جایی بسیار تشکر دارد که آموزش را به صورت ساده و روان تدریس میکنید. :)
بنده پروژه رو مطابق با ویدئوهای شما جلو میبرم، مشکلی در ارسال فایل به اکشن مورد نظر Products/Create دارم
null ارسال میشود جالب اینجاست تریس هم میکنم میگه فایلی انتخاب نکردیده اید..
از ViewModel هم استفاده کردم نشد... و همین خطا رو واسه گروه های انتخاب شده هم دارم. لیست گروه های محصول رو که انتخاب کردم به اکشن ارسال نمیکنه.
این خصوصیت هم توی ویوی مورد نظر گذاشتم
@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" })){
...
}
سلام
کد ویو و اکشن پست را قرار دهید
سلام وقت بخیر، کدهای مربوطه به شکل زیر هستند، البته تلاش کردم با ViewModel پیاده سازی کنم.
public class CreateProductViewModel
{
public Products Product { get; set; }
public List<ProductGroups> ProductGroups { get; set; }
public HttpPostedFileBase ImageProduct { get; set; }
public string Tags { get; set; }
}
کد مربوط به اکشن:
public ActionResult Create(CreateProductViewModel create)
//public ActionResult Create([Bind(Include = "Id,Title,ShortDescription,Text,Price,ImageName,CreateDate")] Products products, List<int> selectedGroups, HttpPostedFileBase imageProduct, string tags)
{
if (ModelState.IsValid)
{
if (create.ProductGroups == null)
{
ViewBag.ErrorSelectedGroup = true;
//ViewBag.Groups = db.ProductGroups.ToList();
create.ProductGroups = db.ProductGroups.ToList();
return View(create);
}
create.Product.ImageName = "default.png";
if (create.ImageProduct != null && create.ImageProduct.IsImage())
{
create.Product.ImageName = Guid.NewGuid().ToString() + Path.GetExtension(create.ImageProduct.FileName);
create.ImageProduct.SaveAs(Server.MapPath("~/Images/Products/" + create.Product.ImageName));
ImageResizer resizer = new ImageResizer();
resizer.Resize(Server.MapPath("~/Images/Products/" + create.Product.ImageName),
Server.MapPath("~/Images/Products/Thumb/" + create.Product.ImageName));
}
create.Product.CreateDate = DateTime.Now;
db.Products.Add(create.Product);
foreach (var selectedGroup in create.ProductGroups)
{
db.ProductSelectedGroups.Add(new ProductSelectedGroups()
{
ProductId = create.Product.Id,
GroupId = selectedGroup.Id
});
}
if (!string.IsNullOrEmpty(create.Tags))
{
string[] keyWords = create.Tags.Split(',');
foreach (var word in keyWords)
{
db.ProductTags.Add(new ProductTags()
{
ProductId = create.Product.Id,
Tag = word.Trim()
});
}
}
db.SaveChanges();
return RedirectToAction("Index");
}
//ViewBag.Groups = db.ProductGroups.ToList();
create.ProductGroups = db.ProductGroups.ToList();
return View(create);
}
کد مربوط به ویو:
@using Eshop.Data
@model Eshop.Models.CreateProductViewModel
@{
ViewBag.Title = "افزودن محصول جدید";
}
<h2>افزودن محصول جدید</h2>
<div class="row">
<div class="col-md-8">
@* جهت ارسال فایل حتما باید تنظیمات زیر را انجام دهیم *@
@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.Product.Title, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Product.Title, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Product.Title, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Product.ShortDescription, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Product.ShortDescription, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Product.ShortDescription, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Product.Text, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Product.Text, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Product.Text, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
@Html.LabelFor(model => model.Product.Price, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
@Html.EditorFor(model => model.Product.Price, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.Product.Price, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<span class="control-label col-md-2">کلمات کلیدی</span>
<div class="col-md-10">
<input type="text" class="form-control" name="tags" placeholder="کلمات کلیدی را با , جدا کنید" />
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<input type="submit" value="ثبت محصول" class="btn btn-success" />
</div>
</div>
</div>
}
</div>
<div class="col-md-4">
<div class="panel panel-primary">
<div class="panel-heading">تصویر محصول</div>
<div class="panel-body">
<img id="imgPreviewProduct" class="thumbnail" style="margin: 10px auto; width: 180px; height: 180px;" src="~/Images/Products/default.png" />
<div class="form-group">
@Html.LabelFor(model => model.Product.ImageName, htmlAttributes: new { @class = "control-label col-md-2" })
<div class="col-md-10">
<input type="file" id="imageProduct" name="imageProduct" />
@Html.ValidationMessageFor(model => model.Product.ImageName, "", new { @class = "text-danger" })
</div>
</div>
</div>
</div>
<div class="panel panel-primary">
<div class="panel-heading">انتخاب گروه</div>
<div class="panel-body">
@if (ViewBag.ErrorSelectedGroup == true)
{
<div class="alert alert-danger">
لطفا گروه محصول را انتخاب کنبد.
</div>
}
@{
List<ProductGroups> groups = Model.ProductGroups;
<ul>
@foreach (var group in groups.Where(g => g.ParentId == null))
{
<li>
<input type="checkbox" name="ProductGroups" value="@group.Id" /> <span>@group.GroupTitle</span>
@if (groups.Any(g => g.ParentId == group.Id))
{
<ul>
@foreach (var subGroup in groups.Where(g => g.ParentId == group.Id))
{
<li>
<input type="checkbox" name="ProductGroups" value="@subGroup.Id" /> <span>@subGroup.GroupTitle</span>
</li>
}
</ul>
}
</li>
}
</ul>
}
</div>
</div>
</div>
</div>
<div>
@Html.ActionLink("بازگشت به لیست محصولات", "Index", null, new { @class = "btn-link" })
</div>
@section Scripts
{
<script src="~/Content/ckeditor/ckeditor.js"></script>
<script src="~/Content/ckeditor/adapters/jquery.js"></script>
<script>
$(function () {
$('#Product_Text').ckeditor();
});
</script>
<script>
function readURL(input) {
if (input.files && input.files[0]) {
var reader = new FileReader();
reader.onload = function (e) {
$('#imgPreviewProduct').attr('src', e.target.result);
}
reader.readAsDataURL(input.files[0]);
}
}
$("#imageProduct").change(function () {
readURL(this);
});
</script>
}
تمامی کدها به شرح فوق میباشند؛ خروجی هم به شکل زیر می باشد:
با تشکر از شما :)
مشکلی در کدها تون ندیدم
البته اینطوری هم نمیشه
باید Debug بشه تا مشکل رو پیدا کنید
جناب مدائنی عزیز؛ بعد از بررسی بیشتر در کدها بهمراه تریس برنامه باز هم متوجه خطا نشدم؛ مشکلی تو کدها پیدا نکردم..
مجبور شدم کدهای شما رو جایگزین کنم که کارم انجام بشه... از همکاری شما کمال تشکر را دارم