سؤال

وأنا أقدر أن هذا قد يكون سؤال بسيط إلى حد ما - ولكن أواجه قدرا كبيرا من المتاعب (كمطور ASP.NET الفرخ). لقد اكتسبت عددا من الأفكار من SO وجوجل مع أي حظ وأعتقد أنني بدأت المبالغة في التفكير هذا، يبدو مثل هذا السيناريو القياسية التي أعتقد أنا في عداد المفقودين شيء واضح.

ولدي على سبيل المثال، ثلاثة سبيل المثال الجداول القياسية - لاحظ علاقة كثير إلى كثير

Students
- student_id
- forename
- surname

Courses
- course_id
- course_name

StudentCourses
- studentcourse_id
- course_id
- student_id

وأود أن عرض هذه على بلدي ASP.NET 3.5 تطبيق ويب بطريقة تبدو مشابهة إلى (العمود الأخير كونه زر للسماح لهم لتحرير المعلومات الطالب):

Students:
#  Name          Courses                 Actions
1  Joe Bloggs    Maths, English          [Manage]
2  Arthur Sleep  English                 [Manage]
3  Andy Mann     Maths, German, French   [Manage]

وعمود "دورات" هي قائمة من الدورات التي المقيد بها الطالب حاليا عليها. وهذا يمكن أن تكون فارغة (لم المسجلين) أو تحتوي على قائمة (بفواصل أو قائمة غير مرتبة HTML القياسية، وأنا لست الثمينة) من دراستهم المسجلين حاليا. وهذا لن يكون على قائمة ضخمة كما يمكن للطالب الالتحاق فقط على عدد قليل من الدورات في وقت واحد.

ولقد حاول عدد من الحلول، وتتراوح ما بين آسيا والمحيط الهادئ: ومكرر إلى المفضلة الحالي، يكون ListView التي جاءت مع 3.5. أنا باستخدام LINQ إلى SQL كما طبقة البيانات الخاصة بي (في حال فإنه من المهم نظرا لLINQs دعم معقد للعلاقات عديدة لكثير).

هل كانت مفيدة؟

المحلول

وبكل بساطة، يمكنك إضافة بضع خصائص جديدة إلى فئة "الطالب" على النحو التالي (C #):

public IEnumerable<Course> Courses
{
    get { return CourseRepository.GetCoursesByStudentId(this.Student_Id); }
}

//Aggregate course names into a comma-separated list
public string CoursesDescription 
{
    get 
    {
        if (!Courses.Any())
            return "Not enrolled in any courses";

        return Courses.Aggregate(string.Empty, (currentOutput, c) =>
              (!String.IsNullOrEmpty(currentOutput)) ?
              string.Format("{0}, {1}", currentOutput, c.Course_Name) :  c.Course_Name );
    }  
}

والآن عندما ستحتاج مكرر واحد فقط (بد أن جمع طلابك)، كما تتم إزالة ضرورة قيام مكرر الفرعية بواسطة الخاصية "CoursesDescription" على فئة الطلاب.

وبوصفها جانبا، وأود أن أوصي تسمية الجداول الخاصة بك في صيغة المفرد (أي سمها لهم بعد ما يمثل الصف 1). أيضا، هناك حجة قوية لإزالة العمود الهوية من الجدول StudentCourses واستبدالها مع مفتاح مركب عبر Student_Id وCourse_Id.

وآمل أن يساعد هذا.

نصائح أخرى

ويمكنك استخدام الراسبين المتداخلة. ويدعو المثال التالي طريقة الثانوي في التعليمات البرمجية خلف ملف الذي إرجاع قائمة. يمكنك الوصول إلى جميع المعلومات بالطبع من هذا. أتمكن من الحصول على عمل مع أسلوب من فئة مستودع ذلك استخدام رمز أدناه للالتفاف حول هذا:

protected List<tblStudentCourses> GetStudentCoursesByStudentID(int id)
{
return studentRepository.GetStudentCoursesByStudentID(id).ToList();
}

وهنا هو المثال الكامل:

<asp:Repeater ID="parentRepeater" runat="server" DataSourceID="myDataSource">
<HeaderTemplate>          
 Header HTML         
</HeaderTemplate>

<ItemTemplate>

    <asp:Repeater ID="availabilityRepeater" runat="server" DataSource='<%#GetStudentCoursesByStudentID(Convert.ToInt32(Eval("studentCourseID"))) %>'>
        <ItemTemplate>
            <%# Eval("tblStudentCourses.courseName")  %><br />
        </ItemTemplate>
    </asp:Repeater>

    Student Name example: <%#Eval("studentName")%>

</ItemTemplate>
<FooterTemplate>
    Footer HTML 
</FooterTemplate>

                    

وهذا قد لا يكون الحل الأمثل ولكن هو الحل العمل ولذا فإنني آمل أن يساعدك

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