具有键“类别”的ViewData项的类型为“System.String”,但必须是“IEnumerable <selectlistitem>”类型</selectlistitem>

时间:2013-07-12 04:21:18

标签: asp.net-mvc razor html.dropdownlistfor

我是asp.net MVC的新手,希望有人可以提供帮助。 我尝试将创建表单的类别字段更改为dorpdownlist。 下拉列表中的项目来自表格 - Catagory

一切似乎都很好,但是当我提交创建时,我收到了错误消息

  

具有键'category'的ViewData项的类型为'System.String',但必须是'IEnumerable&lt; SelectListItem&gt;'的类型

这是我的控制器代码:

 public ActionResult Create()
 {
     IEnumerable<SelectListItem> items = db.Catagorys
        .Select(c => new SelectListItem
        {

            Text = c.CatagoryName

        });

        ViewBag.Searchcategory = items;
        return View();
 } 

    //
    // POST: /Admin/Create

    [HttpPost]
    public ActionResult Create(Contact contact)
    {
        try
        {
            if (ModelState.IsValid)
            {

                db.Contacts.Add(contact);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
        catch (DataException)
        {
            //Log the error (add a variable name after DataException)
            ModelState.AddModelError("", "Unable to save changes, Try again.");

        }

        return View(contact);
    }

这是我的创建视图代码:

<div class="editor-field">
    @Html.DropDownListFor(model => model.category, (IEnumerable<SelectListItem>)ViewBag.Searchcategory, "--Select One--")
    @Html.ValidationMessageFor(model => model.category)
</div>

1 个答案:

答案 0 :(得分:1)

在帖子中,如果ModelState无效,则返回视图。但是你只在get请求中填写类别选择列表,你也应该在post中

[HttpPost]
public ActionResult Create(Contact contact)
{
    try
    {
        if (ModelState.IsValid)
        {

            db.Contacts.Add(contact);
            db.SaveChanges();
            return RedirectToAction("Index");
        }
    }
    catch (DataException)
    {
        //Log the error (add a variable name after DataException)
        ModelState.AddModelError("", "Unable to save changes, Try again.");

    }

    IEnumerable<SelectListItem> items = db.Catagorys
    .Select(c => new SelectListItem
    {

        Text = c.CatagoryName

    });

    return View(contact);
}

当然,如果您使用selectlist属性创建CreateContactViewModel类,那将会很棒。并摆脱使用ViewBag