c# - .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" });
}
}
解决方案
(原谅格式,在移动设备上)
DropDownListFor 需要一个选择列表集合
您的第一个参数是您要分配给的属性,那么您需要将第二个参数作为 SelectList
DropDownListFor(m => m.ProductObj.Product.KategoriID, new SelectList(Model.Products));
您需要Products
用您自己的产品集合替换,这是您模型中的一个属性。
有关更多信息,请参阅此内容:EditorTemplate 中的 DropDownListFor 未选择值
推荐阅读
- python - 使用用户名和图像自动完成
- javascript - 有什么方法可以使此代码在单击“下载”按钮并要求输入密码(由我提供)然后开始下载时像提示一样工作
- azure - “不支持的仅应用程序令牌”SharePoint API 错误,即使在添加证书后也是如此
- android - 尝试登录时 Firebase 身份验证失败
- cassandra - Cassandra添加节点问题,失败;error='无法分配内存' (errno=12)
- javascript - 什么可能导致 MUI Snackbar 无法生成正确的类名?
- haxe - 是否可以使用 Heaps 游戏引擎逐帧控制 3D 动画的播放?
- string - 打字稿 - 逗号运算符的左侧未使用并且没有副作用 - 如何在 hookrouter 的路由中使用常量代替字符串?
- java - 如何减慢java中的程序执行速度?
- node.js - 在 IBM Cloudant http 日志记录中获得“未经授权”?