سؤال

خلفية

أتلقى الخطأ التالي عند محاولة تقديم عرض جزئي في ASP.NET MVC. أنا جديد على ASP.NET MVC وأنا متأكد من أن الخطأ بسيط لحل وإنشاق فقط من عدم وجود فهم كامل.

سؤال (لأولئك الذين لا يريدون قراءة كل شيء):

ما الذي يسبب هذا الخطأ؟

تفاصيل الاستثناء: System.InvalidOperationException: تم تمرير عنصر النموذج في القاموس من النوع 'MyApp.Models.ClassroomFormViewModel'لكن هذا القاموس يتطلب عنصر نموذج من النوع 'System.Collections.Generic.IEnumerable1 [myapp.models.classroomforviewmodel] "`.


تحريك

لدي كيانان مع علاقة الوالدين / الطفل.

Classroom Stickynote ------------ ----------- ID 1 ----- اسم المعرف  الاسم (...)  المحتوى ---- * classroomid

نموذج

في ال Model يتم الاحتفاظ بمحتوى Stickynote في طاولة مختلفة، والوصول إليها (باستخدام Linq-to-SQL من خلال الطريقة التالية:

public IQueryable<StickyNote> GetStickyNotesByClassroom(Classroom classroom)
{
     return from stickynote in db.StickyNotes
            where stickynote.ClassroomID == classroom.ID
            select stickynote;
}

خطأ

لقد قمت بإنشاء طريقة عرض جزئية لعرضها StickyNote المحتوى لأنه "ينتمي" إلى الفصل الدراسي المشكلة التي أركض فيها هي أنني غير قادر على عرضها لعرضها، واستلم الخطأ التالي:

عنصر النموذج الذي تم تمريره في القاموس من النوع: 'MyApp.Models.ClassroomFormViewModel'لكن هذا القاموس يتطلب عنصر نموذج من النوع 'System.Collections.Generic.IEnumerable1 [myapp.models.classroomforviewmodel] "`. الوصف: حدث استثناء غير معالج أثناء تنفيذ طلب الويب الحالي. يرجى مراجعة تتبع المكدس لمزيد من المعلومات حول الخطأ وأين نشأ في التعليمات البرمجية.

تفاصيل الاستثناء: System.InvalidOperationException: تم تمرير عنصر النموذج في القاموس من النوع 'MyApp.Models.ClassroomFormViewModel'لكن هذا القاموس يتطلب عنصر نموذج من النوع 'System.Collections.Generic.IEnumerable1 [myapp.models.classroomforviewmodel] "`.

نظرة جزئية

هنا رمز العرض الجزئي:

<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<IEnumerable<MyApp.Models.ClassroomFormViewModel>>" %>

    <table background="../../images/corkboard.jpg">

    <% foreach (var items in Model) { %>

        <tr>
        <% foreach (var item in items.StickyNotes) { %>
            <td><div class="sticky_note_container">

<!-- actually use a post it note here on the page -->
<div class="sticky_note">
<div class="sticky_note_content">
<!-- content of sticky note here -->
<% Html.ActionLink(item.Name, "ShowStickyNoteContent"); %>
<!-- end of content of sticky note -->
</div>
</div>
<div class="sticky_note_footer">&nbsp;</div>
<br clear="all" />
</div>
         </td>
      <% } %>
     </tr>
   <% } %>
</table>

عرض الوالدين

والرمز من الرأي الآخر الذي يسميه:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits=
"System.Web.Mvc.ViewPage<MyApp.Models.ClassroomFormViewModel>" %>
{...}
  <% 
     Html.RenderPartial("StickyNotes", Model);
  %>
هل كانت مفيدة؟

المحلول

أنت تمر في مثيل واحد من الفصل الدراسي الخاص بك في الفصل الدراسي الخاص بك وفي طريقة العرض تتوقع مجموعة AA IE IEnumerable<ClassroomFormViewModel>.

تغيير إعلانك في الجزئي الخاص بك إلى

Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>"

أو

ما تريد حقا (بعد النظر حقا في التعليمات البرمجية الخاصة بك) هو IEnumerable<ClassroomFormViewModel>

لذلك يجب أن يكون النموذج الخاص بك في صفحة الاتصال الخاصة بك IEnumerable<ClassroomFormViewModel>

أساسا كنت تحاول القيام بذلك

public void Render(ClassroomFormViewModel model)
{
    RenderPartial(model) //Cannot cast single instance into an IEnumerable
}
public string RenderPartial(IEnumerable<ClassroomFormViewModel> model)
{
    //Do something
}

نصائح أخرى

يجب أن تبدأ الجزئية الخاصة بك

<%@ Control Language="C#" Inherits="
System.Web.Mvc.ViewUserControl<MyApp.Models.ClassroomFormViewModel>" >

أعتقد أنك تريد عرض فصل دراسي واحد على الصفحة. إذا كنت ترغب في عرض أكثر من ذلك، فلا تستخدم قائمة ViewModels. استخدم One ViewModel الذي يحتوي على قائمة من الفصول الدراسية

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top