nyt1972 Ответов: 1

Пункт viewdata, которая institutionid ключ ' - это типа 'System.типа int32' но должны быть типа 'интерфейс IEnumerable&ЛТ;selectlistitem&ГТ;


Привет,

У меня есть взаимосвязанные таблицы, студенты имеют отношение один ко многим с зачислением, в то время как Enroll дополнительно имеет отношения с таблицами Institution, Session , Class и Section, я создал ViewModel StudentVM

и хотел вставить данные в таблицу студентов, а также зачисление.

Когда я ввожу данные в форму и отправляю, то все работает нормально.

но когда я отправляю пустые и оставляю некоторые обязательные поля, я получаю эту ошибку. ошибка находится ниже

Server Error in '/' Application.
The ViewData item that has the key 'InstitutionID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.

Exception Details: System.InvalidOperationException: The ViewData item that has the key 'InstitutionID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.

Source Error:


Line 19:             @Html.Label("Institution", htmlAttributes: new { @class = "control-label col-md-2" })
Line 20:             <div class="col-md-10">
Line 21:                 @Html.DropDownList("InstitutionID", ViewBag.InstitutionID as SelectList, "-Select Institution-",  new { @class = "form-control" } )
Line 22:             </div>
Line 23:         </div>

Source File: D:\Projects\ASP.net\MVC\School Management\SchoolMVC\SchoolMVC\Views\Students\Create.cshtml    Line: 21

Stack Trace:


[InvalidOperationException: The ViewData item that has the key 'InstitutionID' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.]
   System.Web.Mvc.Html.SelectExtensions.GetSelectData(HtmlHelper htmlHelper, String name) +355
   System.Web.Mvc.Html.SelectExtensions.SelectInternal(HtmlHelper htmlHelper, ModelMetadata metadata, String optionLabel, String name, IEnumerable`1 selectList, Boolean allowMultiple, IDictionary`2 htmlAttributes) +118
   System.Web.Mvc.Html.SelectExtensions.DropDownList(HtmlHelper htmlHelper, String name, IEnumerable`1 selectList, String optionLabel, Object htmlAttributes) +38
   ASP._Page_Views_Students_Create_cshtml.Execute() in D:\Projects\ASP.net\MVC\School Management\SchoolMVC\SchoolMVC\Views\Students\Create.cshtml:21
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +197
   System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +105
   System.Web.WebPages.StartPage.RunPage() +17
   System.Web.WebPages.StartPage.ExecutePageHierarchy() +64
   System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +78
   System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +235
   System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107
   System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420
   System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +52
   System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +173
   System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100
   System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +36
   System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +22
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +26
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21
   System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +29
   System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +28
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9836613
   System.Web.HttpApplication.ExecuteStepImpl(IExecutionStep step) +50
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +163


Что я уже пробовал:

модели представления:
namespace SchoolMVC.Models.ViewModel
{
    public class StudentsVM
    {
        public int StudentID { get; set; }
        [Required(ErrorMessage = "Admission number is required.")]
        public string AdmissionNo { get; set; }
        public string awrno { get; set; }
        public string boardregno { get; set; }
        [Required(ErrorMessage = "Student Name is required.")]
        public string StudentName { get; set; }
        [Required(ErrorMessage = "Father Name is required.")]
        public string FatherName { get; set; }
        public string MotherName { get; set; }
        public string FatherCNO { get; set; }
        public string FatherCNIC { get; set; }
        public string PermanentAddress { get; set; }
        public string TemporaryAddress { get; set; }
        public string ContactNo { get; set; }
        public string EmailID { get; set; }
        public Nullable<System.DateTime> DOB { get; set; }
        public string Gender { get; set; }
        public Nullable<System.DateTime> AdmissionDate { get; set; }
        public string Religion { get; set; }
        public byte[] Photo { get; set; }
        public string Nationality { get; set; }
        public string LastSchoolAttended { get; set; }
        public string Result { get; set; }
        public string PassPercentage { get; set; }
        public string House { get; set; }
        public string AccountNo { get; set; }
        public string AccountName { get; set; }
        public string Bank { get; set; }
        public string Branch { get; set; }
        public string IBANCode { get; set; }
        public int EnrollID { get; set; }
        public int InstitutionID { get; set; }
        public int SessionID { get; set; }
        public int ClassID { get; set; }
        public int SectionID { get; set; }
    }
}


А мои методы Create Get и Post выглядят следующим образом:

   public ActionResult Create()
        {
            ViewBag.ClassID = new SelectList(db.tblClasses, "ClassID", "ClassName");
            ViewBag.InstitutionID = new SelectList(db.tblInstitutes, "InstitutionID", "Institution");
            ViewBag.SessionID = new SelectList(db.tblSessions, "SessionID", "SessionName");
            return View();
        }

        // POST: Students/Create
        // To protect from overposting attacks, please enable the specific properties you want to bind to, for 
        // more details see http://go.microsoft.com/fwlink/?LinkId=317598.
        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult Create( StudentsVM Student)
        {
            if (ModelState.IsValid)
            {
                tblStudent st = new tblStudent();
                st.StudentName = Student.StudentName;
                st.FatherName = Student.FatherName;
                st.AdmissionNo = Student.AdmissionNo;
                db.tblStudents.Add(st);
                db.SaveChanges();
                // InsertEnrollmet(Student);
                var stuID = st.StudentID;
                tblEnrollment en = new tblEnrollment();
                en.StudentID = stuID;
                en.InstitutionID = Student.InstitutionID;
                en.SessionID = Student.SessionID;
                en.ClassID = Student.ClassID;
                en.SectionID = Student.SectionID;
                db.tblEnrollments.Add(en);
                db.SaveChanges();
                return RedirectToAction("Index");
            }
ViewBag.ClassID = new SelectList(db.tblClasses, "ClassID", "ClassName");
            ViewBag.InstitutionID = new SelectList(db.tblInstitutes, "InstitutionID", "Institution");
            ViewBag.SessionID = new SelectList(db.tblSessions, "SessionID", "SessionName");

            return View(Student);
        }


На вид это выглядит так как показано ниже

<div class="form-group">
          @Html.Label("Institution", htmlAttributes: new { @class = "control-label col-md-2" })
          <div class="col-md-10">
              @Html.DropDownList("InstitutionID", (IEnumerable<SelectListItem>) ViewData["InstitutionID"] as SelectList , "-Select Institution-",  new { @class = "form-control" } )
              @Html.ValidationMessageFor(model => model.InstitutionID, "", new { @class = "text-danger" })
          </div>
      </div>

Gerry Schmitz

Звучит ли "SelectList" так, как будто он должен возвращать скаляр или коллекцию?

nyt1972

Он должен возвращать коллекцию, и это происходит, но ошибка возникает, если я не выбираю ни одного или оставляю любое Обязательное поле пустым.

Я ожидаю сообщения об ошибке, что InstitutionID не выбран или что-то в этом роде, но оно выдает эту ошибку IENUMERABLE.

Gerry Schmitz

Если это так, то вы назначаете коллекции скалярным свойствам.

nyt1972

Проходя выберите список, чтобы пост создать способ решить проблему

1 Ответов

Рейтинг:
0

Sandeep Mewara

Цитата:
Пункт ViewData, которая InstitutionID ключ ' - это типа 'System.Типа int32' но должны быть типа 'интерфейс IEnumerable&ЛТ;selectlistitem&ГТ;'.

Цитата:
@Html.DropDownList("InstitutionID", (IEnumerable<selectlistitem>) ViewData["InstitutionID"] as SelectList , "-Select Institution-", new { @class = "form-control" } )

Цитата:
Видовой мешок.InstitutionID = новый список выбора(db.tblinstitutions, "InstitutionID", "Institution");

Попробуйте ниже:
@Html.DropDownList("InstitutionID", (IEnumerable<SelectListItem>)ViewBag.InstitutionID, "-Select Institution-", new { @class ="form-control" })

Ссылка: http://msdn.microsoft.com/en-us/library/system.web.mvc.html.selectextensions.dropdownlistfor%28v=vs.108%29.aspx[^]