首页 > 解决方案 > 传入字典的模型项的类型为 'koelkast.Models.ProductsModel

问题描述

当我尝试提交我的编辑表单时,我遇到了这个问题,我不知道为什么

产品控制器编辑获取

public async Task<ActionResult> Edit(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        //ProductsModel productsModel = await db.ProductsModels.FindAsync(id);
        var products = await db.ProductsModels.Include(a =>a.categorieId).Include(a => a.users).FirstAsync(a => a.id == id);
        if (products == null)
        {
            return HttpNotFound();
        }


        var selectedOwnerId = products.users?.Id ?? string.Empty;
        var users = db.Users.Select(userItem => new SelectListItem
        {
            Text = userItem.Email,
            Value = userItem.Id,
            Selected = userItem.Id == selectedOwnerId
        }).ToSafeReadOnlyCollection();


        var selectedCategoryId = products.categorieId.id;
        var productCategories = db.ProductCategoriesModels
           .Select(a => new SelectListItem
           {
               Value = a.id.ToString(),
               Text = a.name,
               Selected = a.id == selectedCategoryId
           }).ToSafeReadOnlyCollection();



        var viewmodel = new productCreatEditViewModel()
        {
            Products = products,
            productCategories = productCategories,
            users = users
        };
        //ViewBag.users = userList;
        //ViewBag.productcategorieId = new SelectList(db.ProductCategoriesModels, "id", "Name", productsModel.productcategorieId);
        return View(viewmodel);
    }

产品控制器编辑帖子

// POST: Products/Edit/5
    // To protect from overposting attacks, enable the specific properties you want to bind to, for 
    // more details see https://go.microsoft.com/fwlink/?LinkId=317598.
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit([Bind(Include = "id,name,calorie,price,productcategorieId,userId")] ProductsModel productsModel)
    {
        if (ModelState.IsValid)
        {
            db.Entry(productsModel).State = EntityState.Modified;
            await db.SaveChangesAsync();
            return RedirectToAction("Index");
        }
        ViewBag.productcategorieId = new SelectList(db.ProductCategoriesModels, "id", "Name", productsModel.productcategorieId);
        return View(productsModel);
    }

编辑视图

    @model koelkast.ViewModels.productCreatEditViewModel

@{
    ViewBag.Title = "Edit";
}

<h2>Edit</h2>


@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    
<div class="form-horizontal">
    <h4>ProductsModel</h4>
    <hr />
    @Html.ValidationSummary(true, "", new { @class = "text-danger" })
    @Html.HiddenFor(model => model.Products.id)

    <div class="form-group">
        @Html.LabelFor(model => model.Products.name, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Products.name, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Products.name, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Products.calorie, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Products.calorie, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Products.calorie, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Products.price, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.EditorFor(model => model.Products.price, new { htmlAttributes = new { @class = "form-control" } })
            @Html.ValidationMessageFor(model => model.Products.price, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Products.categorieId.name,  htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => Model.Products.categorieId.id,Model.productCategories, new { Name = "productCategoriesId", @class ="form-control"})
            @Html.ValidationMessageFor(model => model.productCategories, "", new { @class = "text-danger" })
        </div>
    </div>

    <div class="form-group">
        @Html.LabelFor(model => model.Products.users.Email,  htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => Model.Products.users.Id,Model.users, new {Name = "UserId", @class = "form-control" })
            @Html.ValidationMessageFor(model => model.Products.users.Email, "", new { @class = "text-danger" })

        </div>
    </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")
}

视图模型

传入字典的模型项的类型为“koelkast.Models.ProductsModel”,但该字典需要类型为“koelkast.ViewModels.productCreatEditViewModel”的模型项。

namespace koelkast.ViewModels
{
    public class productCreatEditViewModel
    {
        [Required]
        public ProductsModel Products { get; set; }

        [Required]
        public ICollection<SelectListItem> productCategories { get; set; }

        [Required]
        public ICollection<SelectListItem> users { get; set; }


    }
}

产品型号

namespace koelkast.Models
{
    public class ProductsModel
    {

        [Key]
        public int id { get; set; }

        [Required,Display(Name = "name")]
        public string name { get; set; }


        //display name is de naam die hij gaat laten zien als nnaam in je view
        [Required, Display(Name = "calorie")]
        public int calorie { get; set; }

        [Required, Display(Name = "price")]
        public float price { get; set; }

        [Display(Name = "categories")]

        //hier zet je die foreing key
        //zoals je kunt zien roep ik alleen de model aan
        public int? productcategorieId { get; set; }
        
        [ForeignKey("productcategorieId")]
        public virtual ProductCategoriesModel categorieId { get; set; }

        //je zegt hier dus dat dit de Id is(userId)
        //van applicationUser table users
        public string UserId { get; set; }

        [ForeignKey("UserId")]
        public virtual ApplicationUser users { get; set; }


      
    }
}
    

https://i.stack.imgur.com/Qaq67.png

标签: c#asp.netasp.net-mvcrazormvvm

解决方案


你这里有一个错误,修复它

public async Task<ActionResult> Edit(ProductsModel productsModel)
    {
        
    }

你有2个选择

1.将 ProductsModel 更改为 ProductCreatEditViewModel

或者

  1. 将 ProductCreatEditViewModel 作为模型返回
 var viewmodel = new productCreatEditViewModel()
        {
            Products = productsModel,
            productCategories = productCategories,
            users = users
        };
return View(viewModel);

推荐阅读