具有键'Attribute'的ViewData项的类型为'System.String',但必须是'IEnumerable <selectlistitem>'类型

时间:2015-11-10 08:17:23

标签: c# asp.net-mvc

我在Dropdownlist中绑定了类别和性别。我的模型有两个属性映射到其他表中的列:

        [Required(ErrorMessage = "Choose your category")]
        public string Category { get; set; }

        [ForeignKey("Category")]
        [NotMapped]
        public virtual Category Category_Name { get; set; }

        [Required(ErrorMessage = "Choose your category")]
        public string Gender { get; set; }

        [ForeignKey("Gender")]
        [NotMapped]
        public virtual Gender Gender_Name { get; set; }

我的ProductsController有一个名为“Create”的方法,用于上传

 public ActionResult Create()
        {
            ViewBag.Category = new SelectList(
                db.Categories.ToList(),
                "Category_ID",
                "Category_Name")
                ;
            ViewBag.Gender = new SelectList(
                db.Genders.ToList(),
                "Gender_ID",
                "Gender_Name"
                );
            return View();
        }

        //
        // POST: /Products/Create

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create(Products products)
        {
            if (products.Image.ContentLength > (2 * 1024 * 1024))
            {
                ModelState.AddModelError("CustomError", "The Size of the
             Image is 2MB");
                return View();
            }
            if (!(products.Image.ContentType == "image/jpeg" || 
                products.Image.ContentType == "image/gif"))
            {
                ModelState.AddModelError("CustomError", "File type allowed :
              jpeg and gif");
                return View();
            }

            byte[] data = new byte[products.Image.ContentLength];
            products.Image.InputStream.Read(data, 0, 
            products.Image.ContentLength);
            products.Product_Photo = data;
            db.Products.Add(products);
            db.SaveChanges();
            return View(products);
        }

对应的观点是:

@model  eKart.Models.Products

@{
    ViewBag.Title = "Create";
}

<h2>Create</h2>

@using (Html.BeginForm("Create", "Products", FormMethod.Post, new { enctype
              = "multipart/form-data" }))
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary(true)

    <fieldset>
        <legend>Products</legend>

        <div class="editor-label">
            @Html.LabelFor(model => model.Product_Name)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Product_Name)
            @Html.ValidationMessageFor(model => model.Product_Name)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Product_Quantity)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Product_Quantity)
            @Html.ValidationMessageFor(model => model.Product_Quantity)
        </div>

        <div class="editor-label">
            @Html.LabelFor(model => model.Product_Price)
        </div>
        <div class="editor-field">
            @Html.EditorFor(model => model.Product_Price)
            @Html.ValidationMessageFor(model => model.Product_Price)
        </div>
        <div>
            @Html.LabelFor(model=>model.Product_Photo)
        </div>
         <div>

            @Html.TextBoxFor(model=> model.Image, new{type="file"})
            @Html.ValidationMessage("CustomError")
           </div>

        <div class ="editor-label">
           @Html.LabelFor(model => model.Category)
        </div>
        <div class="editor-field">
            @Html.DropDownList("Category",
           (SelectList)ViewBag.Category,"Choose Category")
            @Html.ValidationMessageFor(model=>model.Category)
        </div>
        <div class ="editor-label">
            @Html.LabelFor(model=>model.Gender)
        </div>
        <div class ="editor-field">
            @Html.DropDownList("Gender",(SelectList)ViewBag.Gender,"Choose 
           Gender")
            @Html.ValidationMessageFor(model=>model.Gender)
        </div>
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
}

<div>
    @Html.ActionLink("Back to List", "Index")
</div>

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
}

当我提交表单时,我点击了上面提到的“类别”中的错误。我检查了StackOverFlow但没有找到有用的信息。我真的想知道发生了什么以及我做错了什么。谢谢提前你的帮助

1 个答案:

答案 0 :(得分:2)

在班级中添加新媒体资源:

型号:

[Required(ErrorMessage = "Choose your category")]
public string Category { get; set; }

public List<System.Web.Mvc.SelectListItem> CategoryList { get; set; }

控制器:

public ActionResult Create()
{
    var model = new Products();
    model.CategoryList = db.Categories.Select(x => new SelectListItem
    {
        Text = x.CategoryName,
        Value = x.CategoryName
    }).ToList();

    return View(model);
}

编辑:正如StephenMuecke在评论中所说,当CategoryList无效时,您需要将值重新分配给ModelState媒体资源。

[HttpPost]
public ActionResult Create(Product product)
{
    if(ModelState.IsValid)
    {
        // Code here
    }

    product.CategoryList = db.Categories.Select(x => new SelectListItem
    {
        Text = x.CategoryName,
        Value = x.CategoryName
    }).ToList();

    return View(product);
}

查看:

<div class ="editor-label">
   @Html.LabelFor(model => model.Category)
</div>
<div class="editor-field">
    @Html.DropDownListFor(model => model.Category, Model.CategoryList, "Choose category")
    @Html.ValidationMessageFor(model=>model.Category)
</div>

在性别&#39;

中执行相同的操作