繁体   English   中英

@ Html.DropDownListFor绑定给出“从类型'System.String'到类型的参数转换”错误

[英]@Html.DropDownListFor binding giving “The parameter conversion from type 'System.String' to type” error

我只是想将@ Html.DropDownListFor绑定到我的视图模型,并且每当我添加新产品时,都会收到错误消息:

“从类型'System.String'到类型'SuperStockpile.Core.Models.Brand'的参数转换失败,因为没有类型转换器可以在这些类型之间进行转换。”

基础实体

public abstract class BaseEntity
{
    public string Id { get; set; }
    [Display(Name = "Created At")]
    public DateTimeOffset CreatedAt { get; set; }

    public BaseEntity()
    {
        Id = Guid.NewGuid().ToString();
        CreatedAt = DateTime.Now;
    }
}

品牌型号

public class Brand : BaseEntity
{
    public string Name { get; set; }
}

查看模型

public class ProductFormViewModel
{
    public Product Product { get; set; }
    public IEnumerable<Brand> Brands { get; set; }
}

库存控制器

public class InventoryController : Controller
{
    private readonly IRepository<Product> _productContext;
    private readonly IRepository<Brand> _brandContext;
    private readonly IRepository<Source> _sourceContext;
    public InventoryController(IRepository<Product> productContext, IRepository<Brand> brandContext, 
        IRepository<Source> sourceContext)
    {
        _productContext = productContext;
        _sourceContext = sourceContext;
        _brandContext = brandContext;
    }
    // GET: Inventory
    public ActionResult Index()
    {
        List<Product> Products = _productContext.Collection().ToList();
        return View(Products);
    }

    public ActionResult Create()
    {
        ProductFormViewModel product = new ProductFormViewModel
        {
            Product = new Product(),
            Brands = _brandContext.Collection().ToList(),
            Sources = _sourceContext.Collection().ToList()
        };
        return View(product);
    }
    [HttpPost]
    public ActionResult Create(ProductFormViewModel vm)
    {
        if (!ModelState.IsValid)
            return View("Create", vm);
        else
        {
            Product product = new Product
            {
                Brand = vm.Product.Brand,
                BrandId = vm.Product.BrandId,
                Comments = vm.Product.Comments,
                Cost = vm.Product.Cost,
                DiscountPercent = vm.Product.DiscountPercent,
                ItemCode = vm.Product.ItemCode,
                Source = vm.Product.Source,
                SourceId = vm.Product.SourceId,
                SKU = vm.Product.SKU,
                UPC = vm.Product.UPC
            };

            _productContext.Insert(product);
            _productContext.Commit();
            return RedirectToAction("Index");
        }
    }
}

视图

 @model SuperStockpile.Core.ViewModels.ProductFormViewModel @{ ViewBag.Title = "Create"; } <h2>Add New Product</h2> @using (Html.BeginForm("Create","Inventory")) { @Html.AntiForgeryToken() <div class="form-horizontal"> <hr /> @Html.ValidationSummary(true, "", new { @class = "text-danger" }) <div class="form-group"> @Html.LabelFor(model => model.Product.SKU) @Html.EditorFor(model => model.Product.SKU, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.SKU) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.UPC) @Html.EditorFor(model => model.Product.UPC, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.UPC) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.ItemCode) @Html.EditorFor(model => model.Product.ItemCode, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.ItemCode) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.Cost) @Html.EditorFor(model => model.Product.Cost, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.Cost) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.DiscountPercent) @Html.EditorFor(model => model.Product.DiscountPercent, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.DiscountPercent) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.Comments) @Html.EditorFor(model => model.Product.Comments, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Product.Comments) </div> <div class="form-group"> @Html.LabelFor(model => model.Product.BrandId) @Html.DropDownListFor(model => model.Product.Brand, new SelectList(Model.Brands, "Id", "Name"),"Select Brand", new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.Product.BrandId) </div> <div class="form-group"> <div class="col-md-offset-2 col-md-10"> <input type="submit" value="Save" class="btn btn-default" /> </div> </div> </div> } <div> @Html.ActionLink("Back to List", "Index") </div> @section Scripts { @Scripts.Render("~/bundles/jqueryval") } 

我不确定如何将下拉列表正确绑定到我的视图模型的Brand属性。 任何有关这种情况发生的帮助或解释都将非常有用!

谢谢您的光临。

不要整体绑定到Brand类,仅绑定到Brand.Id,稍后在控制器中保存到数据库之前,需要获取Brand的其余详细信息。

@Html.DropDownListFor(model => model.Product.Brand.Id, new SelectList(Model.Brands, "Id", "Name"),"Select Brand", new { @class = "form-control" })

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM