首页 > 解决方案 > .Net Core 3 Razor 页面管理员/产品/Upsert.cshtml IEnumerable错误

问题描述

我正在尝试开发一个带有剃须刀页面的项目。当我说从产品页面创建产品时,我遇到了 IEnumerable 错误。由于我不再知道该怎么做,我想在这里分享我的问题。预先感谢您的回答。我还写了一些土耳其语的等价词来理解:

urun->产品

urunAdi->产品名称

urunAciklama->产品说明

类别->类别

resimYolu->imagePath

错误之前: 在此处输入图像描述

错误后: 在此处输入图像描述

管理员\产品\Upsert.cshtml:

@page
@model Propeboru.Pages.Admin.Product.UpsertModel

<form method="post" asp-action="Upsert" enctype="multipart/form-data">
    <div class="container">
        <div class="row px-2 mx-2  border">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

            @if (Model.ProductObj.Product.urunID != 0)
            {
                <input type="hidden" asp-for="ProductObj.Product.urunID" />
            }


           

            <div class="col-12 px-3" style="border-bottom:1px solid #325d88">
                <h2 class="text-primary">@(Model.ProductObj.Product.urunID != 0 ? "Düzenle" : "Oluştur") Ürünler</h2>
            </div>

            <div class="col-8 pt-3">

                <div class="form-group row">
                    <div class="col-3">
                        <label asp-for="ProductObj.Product.urunAdi"></label>
                    </div>
                    <div class="col-9">
                        <input class="form-control" asp-for="ProductObj.Product.urunAdi" />
                        <span class="text-danger" asp-validation-for="ProductObj.Product.urunAdi"></span>
                    </div>
                </div>

                <div class="form-group row">
                    <div class="col-3">
                        <label asp-for="ProductObj.Product.urunAciklama"></label>
                    </div>
                    <div class="col-9">
                        <textarea class="form-control" asp-for="ProductObj.Product.urunAciklama" id="txtDesc" style="height:200px;"></textarea>
                     </div>
                </div>


                <div class="form-group row">
                    <div class="col-3">
                        <label asp-for="ProductObj.Product.kategoriID"></label>
                    </div>
                    <div class="col-9">
                        @Html.DropDownListFor(m => m.ProductObj.Product.kategoriID,
                                                 Model.ProductObj.CategoryList ,
                                                 "- Lütfen ürünün kategorisini seçiniz !-",
                                                 new { @class = "form-control" })
                        <span class="text-danger" asp-validation-for="ProductObj.Product.kategoriID"></span>
                    </div>
                </div>

                <div class="form-group row">
                    <div class="col-3">
                        <label asp-for="ProductObj.Product.resimYolu"></label>
                    </div>
                    <div class="col-9">
                        <input type="file" class ="form-control" name="files" id="uploadBox" />
                       
                    </div>
                </div>

                <div class="form-group row">
                    <div class="col-9 offset-3">
                        <div class="row">
                            <div class="col-6">
                                @if (Model.ProductObj.Product.urunID != 0)
                                {
                                    <button type="submit" class="btn btn-primary form-control">Düzenle</button>
                                }
                                else
                                {
                                    <button type="submit" onclick="return ValidateInput()" class="btn btn-primary form-control">Oluştur</button>
                                }
                            </div>
                            <div class="col-6">
                                <a asp-page="./Index" class="btn btn-success form-control">Listeye Dön</a>
                            </div>
                        </div>
                    </div>
                </div>
            </div>



        </div>
    </div>
</form>

@section Scripts{ 
<script>
    tinymce.init({
        selector: "textarea",
        plugins: "lists",
        menubar: "file edit format"
    });

    function ValidateInput() {
        if (document.getElementById("uploadBox").value == "") {
            swal("Error", "Lütfen ürün resmini seçiniz !", "error")
            return false;
        }
        return true;
    }

</script>
   
}

管理员\产品\Upsert.cshtml.cs:

 public class UpsertModel : PageModel
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IWebHostEnvironment _hostingEnvironment;

        public UpsertModel(IUnitOfWork unitOfWork, IWebHostEnvironment hostingEnvironment)
        {
            _unitOfWork = unitOfWork;
            _hostingEnvironment = hostingEnvironment;

        }

        [BindProperty]
        public ProductVM ProductObj { get; set; }
        public IActionResult OnGet(int? id)
        {
            ProductObj = new ProductVM
            {
                CategoryList = _unitOfWork.Category.GetCategoryListForDropDown(),
                Product = new Model.Product()

            };

            if(id !=null)
            {
                ProductObj.Product = _unitOfWork.Product.GetFirstOrDefault(u => u.urunID == id);
                if(ProductObj.Product == null)
                {
                    return NotFound();
                }
            }
            return Page();
        }

        public IActionResult OnPost()
        {
            string webRootPath = _hostingEnvironment.WebRootPath;
            var files = HttpContext.Request.Form.Files;

            if(!ModelState.IsValid)
            {
                return Page();
            }
            if(ProductObj.Product.urunID == 0)
            {
                string fileName = Guid.NewGuid().ToString();
                var uploads = Path.Combine(webRootPath, @"images\product");
                var extension = Path.GetExtension(files[0].FileName);

                using(var fileStream=new FileStream(Path.Combine(uploads,fileName+extension),FileMode.Create))
                {
                    files[0].CopyTo(fileStream);
                }
                ProductObj.Product.resimYolu = @"\images\product\" + fileName + extension;

                _unitOfWork.Product.Add(ProductObj.Product);
            }
            else
            {
                var objFromDb = _unitOfWork.Product.Get(ProductObj.Product.urunID);
                if(files.Count>0)
                {
                    string fileName = Guid.NewGuid().ToString();
                    var uploads = Path.Combine(webRootPath, @"images\product");
                    var extension = Path.GetExtension(files[0].FileName);

                    var imagePath = Path.Combine(webRootPath, objFromDb.resimYolu.TrimStart('\\'));

                    if(System.IO.File.Exists(imagePath))
                    {
                        System.IO.File.Delete(imagePath);
                    }


                    using (var fileStream = new FileStream(Path.Combine(uploads, fileName + extension), FileMode.Create))
                    {
                        files[0].CopyTo(fileStream);
                    }
                    ProductObj.Product.resimYolu = @"\images\product\" + fileName + extension;

                    //_unitOfWork.Product.Add(ProductObj.Product);
                }
                else
                {
                    ProductObj.Product.resimYolu = objFromDb.resimYolu;
                }

                _unitOfWork.Product.Update(ProductObj.Product);
            }
            _unitOfWork.Save();
            return RedirectToPage("./Index");
        }
    }

产品控制器.cs:

[Route("api/[controller]")]
    [ApiController]
    public class ProductController : Controller
    {
        private readonly IUnitOfWork _unitOfWork;
        private readonly IWebHostEnvironment _hostingEnvironment;

        public ProductController(IUnitOfWork unitOfWork,IWebHostEnvironment hostingEnvironment)
        {
            _unitOfWork = unitOfWork;
            _hostingEnvironment = hostingEnvironment;
        }

        [HttpGet]
        public IActionResult Get()
        {
            return Json(new { data = _unitOfWork.Product.GetAll() });
        }

        [HttpDelete("{id}")]
        public IActionResult Delete(int id)
        {
            try
            {
                var objFromDb = _unitOfWork.Product.GetFirstOrDefault(u => u.urunID == id);
                if (objFromDb == null)
                {
                    return Json(new { success = false, message = "silinme hatası" });
                }
                var resimYolu = Path.Combine(_hostingEnvironment.WebRootPath, objFromDb.resimYolu.TrimStart('\\'));
                if (System.IO.File.Exists(resimYolu))
                {
                    System.IO.File.Delete(resimYolu);
                }

                _unitOfWork.Product.Remove(objFromDb);
                _unitOfWork.Save();

            }
            catch(Exception ex)
            {
                return Json(new { success = false, message = "silinme hatası" });
            }
            return Json(new { success = true, message = "Başarıyla Silindi" });
        }
    }

标签: c#asp.net-core.net-corecrudrazor-pages

解决方案


(原谅格式,在移动设备上)

DropDownListFor 需要一个选择列表集合

您的第一个参数是您要分配给的属性,那么您需要将第二个参数作为 SelectList

DropDownListFor(m => m.ProductObj.Product.KategoriID, new SelectList(Model.Products));

您需要Products用您自己的产品集合替换,这是您模型中的一个属性。

有关更多信息,请参阅此内容:EditorTemplate 中的 DropDownListFor 未选择值

Ms docs: https://docs.microsoft.com/en-gb/dotnet/api/system.web.mvc.html.selectextensions.dropdownlistfor?redirectedfrom=MSDN&view=aspnet-mvc-5.2#System_Web_Mvc_Html_SelectExtensions_DropDownListFor__2_System_Web_Mvc_HtmlHelper___0__System_Linq_Expressions_Expression_System_Func___0___1___System_Collections_Generic_IEnumerable_System_Web_Mvc_SelectListItem__System_Object _


推荐阅读