2015-11-10 35 views
1

我在Dropdownlist中绑定类别和性别。我的模型在其他表映射到列两个属性:具有'属性'键的ViewData项的类型为'System.String',但必须是'IEnumerable <SelectListItem>'的类型

 [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有一个名为“创建”方法,它是用于上传

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

当我提交我打的错误处提到above.I检查计算器,但没有找到有用的information.I真的想知道发生了什么事情和W“分类”的形式在这里我做wrong.Thanks您的帮助提前

+0

的错误是自我解释真的下拉列表需要在SelectListItem不选择列表的,改变你的viewbag.category是一个selectlistitem –

+0

我是mvc的初学者,请告诉我该怎么做? –

+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> 

做相同的“性别”

+0

这有什么好做的问题(虽然它的良好做法)。参考重复内容以了解真正的问题。 –

+0

是值和文本具有相同的值是CategoryName? –

+0

@StephenMuecke谢谢,但他说,当他跑的项目,而不是提交表单后,他打的误差。 –

相关问题