2017-02-24 4 views
0

Ich habe ein Problem mit dem Dropdown-Menü. Aus meinem Code wird der Dropdown-Wert aus der Datenbank angezeigt. Aber wenn ich keine Werte fülle und drücke die Eingabetaste den Fehler Es gibt kein ViewData Item vom Typ 'IEnumerable displays.Es gibt kein ViewData-Element vom Typ 'IEnumerable <SelectListItem>

Im Folgenden sind meine Codes:

Category.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel.DataAnnotations; 
using System.Web.Mvc; 

namespace BusinessLayer 
{ 

    public interface ICategory 
    { 
     int CategoryId { get; set; } 
     string CategoryDescription { get; set; } 

    } 
    public class Category:ICategory 
    { 
     [Required] 
     public int CategoryId { get; set; } 
     [Required] 
     public string CategoryName { get; set; } 
     [Required] 
     public string CategoryDescription { get; set; } 
     [Required] 
     public SelectList CategoryList { get; set; } 
    } 
} 

CategoryBusinessLayer.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Configuration; 
using System.Data; 
using System.Data.SqlClient; 

namespace BusinessLayer 
{ 
    public class CategoryBusinessLayer 
    { 
     public IEnumerable<Category> Categories 
     { 
      get 
      { 
       string connectionString = 
        ConfigurationManager.ConnectionStrings["DBCSS"].ConnectionString; 

       List<Category> categoryList = new List<Category>(); 

       using (SqlConnection con = new SqlConnection(connectionString)) 
       { 
        SqlCommand cmd = new SqlCommand("spGetAllCategory", con); 
        cmd.CommandType = CommandType.StoredProcedure; 
        con.Open(); 
        SqlDataReader rdr = cmd.ExecuteReader(); 
        while (rdr.Read()) 
        { 
         Category categories = new Category(); 
         categories.CategoryId = Convert.ToInt32(rdr["CategoryId"]); 
         categories.CategoryName = rdr["CategoryName"].ToString(); 
         categories.CategoryDescription = rdr["CategoryDescription"].ToString(); 
         categoryList.Add(categories); 
        } 
       } 

       return categoryList; 
      } 
     } 
} 

ProductController.cs

[HttpGet] 
     [ActionName("Create")] 
     public ActionResult Create_Get() 
     { 
      Category category = new Category(); 
      CategoryBusinessLayer cat = new CategoryBusinessLayer(); 
      category.CategoryList = new SelectList(cat.Categories, "CategoryId", "CategoryName"); 
      ViewBag.category = category.CategoryList; 
      return View(); 
     } 

Create.cshtml

@Html.DropDownList("CategoryId", (IEnumerable<SelectListItem>)ViewBag.category as SelectList, "Select Category") 

Danke.

Antwort

0

Das passiert normalerweise, wenn Sie das Formular absenden und Ihre HttpPost-Aktionsmethode die gleiche Ansicht zurückgibt, ohne die ViewData-Elemente neu zu laden, die zum Erstellen des SELECT-Elements benötigt werden.

In Ihren GET- und POST-Aktionen können Sie einfach eine Liste von SelectListItem für ViewBag/ViewData festlegen. Auch dein aktueller Code macht unnötigerweise zweimal das Casting! in der Ansicht mit diesem Ausdruck

(IEnumerable<SelectListItem>)ViewBag.category as SelectList 

Stellen Sie sicher, dass Sie diese Daten erneut laden, bevor Sie die gleiche Ansicht anzeigen.

[HttpPost] 
public ActionResult Create(SomeViewModel model) 
{ 

    // your existing code to get category 
    ViewBag.category = category.CategoryList 
           .Select(x=> new SelectListItem { Value=x.Id, 
                Text= x.CategoryName }).ToList(); 
    return View(model); 
} 

Jetzt in Ihrer Ansicht nach

@Html.DropDownList("CategoryId", ViewBag.category as List<SelectListItem>, 
                     "Select Category") 
Verwandte Themen