ASP.NET MVC ViewData错误

时间:2016-03-16 18:16:47

标签: c# asp.net-mvc

如何解决此错误?它为什么会发生?

  

这里没有类型' IEnumerable< SelectListItem>'那   有关键' IngredientTypeID'。

控制器:

public ActionResult AddIngridient(int id = 0)
{
    IEnumerable<Ingredient> ListOfIngridient =  FRE.Ingredient.Select(key => key).ToList();
    ViewBag.IngridientsList = new SelectList(ListOfIngridient,"IngredientID", "IngredientName");

    IEnumerable<Amount> ListOfAmounts = FRE.Amount.Select(key => key).ToList();
    ViewBag.AmountsList = new SelectList(ListOfAmounts, "AmountID", "AmountName");

    return View(new Ingredients { IngredientID = id });
}

[HttpPost]
public ActionResult AddIngridient(Ingredients ingridients)
{
    FRE.Ingredients.Add(ingridients);
    FRE.SaveChanges();
    return View();
}

查看:

@model FoodRecipes.Models.Ingredients
@{
    ViewBag.Title = "AddIngridient";
}

<h2>AddIngridient</h2>

@using (Html.BeginForm("AddIngridient", "Home"))
{
    @Html.HiddenFor(x => x.IngredientID) 
    @Html.DropDownListFor(model => model.IngredientTypeID, (SelectList)ViewBag.IngridientsList)
    <br />
    @Html.DropDownListFor(model => model.AmountID, (SelectList)ViewBag.AmountsList)
    <input type="submit" value="Create" />
}

型号:

public partial class Ingredients
{
    public int IngredientID { get; set; }
    public Nullable<int> AmountID { get; set; }
    public Nullable<int> IngredientTypeID { get; set; }
}

enter image description here

2 个答案:

答案 0 :(得分:2)

没有太多信息我怀疑你提交后会发生错误。之所以会发生这种情况,是因为您在POST操作中使用与GET操作中相同的视图,但未传递任何数据。您收到错误,因为视图正在尝试呈现HTML,期望模型成为有效对象。

尝试在POST操作中使用不同的视图,如下所示:

return View("Added");

使用该名称创建一个没有模型且该部分应该有效的视图。

注意:最佳做法是创建一个包含所需数据的视图模型(IngredientsList,AmountsList),因此您不必使用ViewBag进行任何操作。类似的东西:

public class IngredientViewModel
{
    public Ingredient Ingredient { get; set; }
    public IEnumerable<Ingredient> IngredientsList { get; set; }
    public IEnumerable<Amount> AmountsList { get; set; }
}

使用此类作为模型。顺便说一下,(我假设它在你的问题中是一个错字)确保你的名字使用一致的复数。 IngredientIngredients

答案 1 :(得分:1)

引发错误是因为您只在Get操作中设置ViewBag.IngridientsListViewBag.AmountsList而不是Post操作。如果您要使用ViewBag传递DropDownList项,则需要确保每次加载视图时都设置它们。

public ActionResult AddIngridient(int id = 0)
{
    LoadViewBag();
    return View(new Ingredients { IngredientID = id });
}

[HttpPost]
public ActionResult AddIngridient(Ingredients ingridients)
{
    if (ModelState.IsValid)
    {
        FRE.Ingredients.Add(ingridients);
        FRE.SaveChanges();
        return RedirectToAction("Index");
    }
    LoadViewBag();
    return View(ingridients);
}

private void LoadViewBag()
{
    IEnumerable<Ingredient> ListOfIngridient = FRE.Ingredient.Select(key => key).ToList();
    ViewBag.IngridientsList = new SelectList(ListOfIngridient, "IngredientID", "IngredientName");

    IEnumerable<Amount> ListOfAmounts = FRE.Amount.Select(key => key).ToList();
    ViewBag.AmountsList = new SelectList(ListOfAmounts, "AmountID", "AmountName");
}