Dlaczego przekaznie pliku daje null

0

Cześć Uczę się dodawać obrazki do stron i mam taki problem wiecie czemu File daje null ?

@model Sklep.ViewModels.EditProductViewModel
    <div class="form-group">
        @Html.LabelFor(m => m.Product.ImagePath, new { @class = "col-md-2 control-label" })
        <div class="col-md-10">
            <input type="file" name="File"  id="File"/>
        </div>
    </div>
       [HttpGet]
        [Authorize(Roles = "User,Admin")]
        public ActionResult AddProduct()
        {
            var categories = db.Categories.ToList();
            var product = new Product();

            EditProductViewModel vm = new EditProductViewModel()
            {
                Product = product,
                Categories = categories
            };

            return View(vm);
        }


        [HttpPost]
        [Authorize(Roles = "Admin,User")]
        public ActionResult AddProduct(EditProductViewModel vm)
        {

            if (ModelState.IsValid)
            {

                if (vm.File != null)
                {
                    vm.File.SaveAs(HttpContext.Server.MapPath("~/Images/")
                                                          + vm.File.FileName);
                    vm.Product.ImagePath = vm.File.FileName;
                }

                Product product = vm.Product;
                var userId = User.Identity.GetUserId();
                product.UserName = UserManager.Users.FirstOrDefault(x => x.Id == userId).UserName;
                db.Products.Add(product);
                db.SaveChanges();
                TempData["message"] = string.Format("Dodano {0}", product.Name);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                var categories = db.Categories.ToList();
                vm.Categories = categories;
                return View(vm);
            }
    public class EditProductViewModel
    {
        public Product Product { get; set; }
        public IEnumerable<Category> Categories { get; set; }
        public IEnumerable<SelectListItem> CategoryItems
        {
            get
            {
                var allItems = Categories.Select(f => new SelectListItem
                {
                    Value = f.CategoryId.ToString(),
                    Text = f.Name
                });

                return allItems;
            }
        }
        public HttpPostedFileBase File { get; set; }
    }
}
1

W ModelState jak dobrze pamiętam możesz podglądnąć błędy dot.bindowania.

0

Kurcze a jak to w tym przypadku naprawić ? i o co chodzi dlaczego jest taki błąd ?

2

Powinieneś pokazać, jak wygląda Twój formularz. Prawdopodobnie nie dodałeś atrybutu enctype o wartości multipart/form-data w elemencie form.

@using (Html.BeginForm("AddProduct", "Product", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    //...
}
0

Mam taki kod właśnie

@using (Html.BeginForm("AddProduct", "Products", FormMethod.Post, new { @class = "form-horizontal", role = "form", enctype = "multipart/form-data" }))
{
1
Michał Warmuz napisał(a):

Mam taki kod:

@using (Html.BeginForm("AddProduct", "Products", FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
{

Więc zmień czwarty argument na new { @class = "form-horizontal", role = "form", enctype = "multipart/form-data" } i powinno działać. Kodowanie multipart/form-data używa się, gdy formularz przesyła pliki metodą POST.

0

Właśnie mam taki kod i też nie działa

@using (Html.BeginForm("AddProduct", "Products", FormMethod.Post, new { @class = "form-horizontal", role = "form", enctype = "multipart/form-data" }))
{

0
WeiXiao napisał(a):

Po co sprawdzić w ModelState gdy można zgadywać? :P

if (ModelState.IsValid)

własnie if daje mi true

1

Jakoś nie jestem fanem tych html helperów

public class Test
{
	public IFormFile File { get; set; }
}

public IActionResult Test(Test data)
{
	return View();
}

<form method="post" asp-action="Test" enctype="multipart/form-data">
    <input type="file" name="File" />
    <button type="submit"></button>
</form>
1

Kurcze sprawdziłem i kiedy miałem name="@Model.File" to taki kod się wygenerował <input type="file" id="file" />
a gdy dodałem sam name="File" to jest dobrze dziękuje :)

2

Twoje programowanie wydaje się być bardzo chaotyczne. Polecam trochę zwolnić i zastanowić się, dlaczego to, co piszesz, działa tak, jak działa. Poprawne formatowanie kodu też jest bardzo ważne, pomaga utrzymać porządek w kodzie, ułatwia innym zrozumienie Twojego kodu i wpływa na ocenę Twojego kodu przez innych programistów.

1 użytkowników online, w tym zalogowanych: 0, gości: 1