Search code examples
asp.net-mvcasp.net-mvc-4razorwebgrid

Mvc 4 Webgrid conditional htmlActionLinks


I've got a webgridextensions class the defines "WebGridColumn" returns for different scenarios..

 public static WebGridColumn ApptLinksWSchedule(this WebGrid grid, HtmlHelper html)
    {

        return grid.Column(
            header: "",
            style: "actionColumn",
            format: item => new HtmlString(
                html.ActionLink("Schedule", "Schedule", new { ID = item.CourseExamApptID }, new { onclick = "return confirm('Are you sure you'd like to schedule this Appointment?');" }).ToString()

            )
        );
    }


    public static WebGridColumn ApptLinksWCancel(this WebGrid grid, HtmlHelper html)
    {

        return grid.Column(
            header: "",
            style: "actionColumn",
            format: item => new HtmlString(
                html.ActionLink("Edit", "Edit", new { ID = item.CourseExamApptID }).ToString() + " | " +
                html.ActionLink("Delete", "Delete", new { ID = item.CourseExamApptID }).ToString() + " | " +
                html.ActionLink("Cancel", "Cancel", new { ID = item.CourseExamApptID }, new { onclick = "return confirm('Are you sure you'd like to cancel this Appointment?');" }).ToString()
            )
        );
    }

In my view I need to conditionally apply an htmlActionLinks according to the value of a model property. If my model.AppointmentStatus = "Scheduled", show one set of action links, if not show another set...

<div class="webgrid-wrapper">
<div id="grid">
    @grid.GetHtml(
        tableStyle: "webgrid",
        headerStyle: "webgrid-header",
        footerStyle: "webgrid-footer",
        alternatingRowStyle: "webgrid-alternating-row",
        selectedRowStyle: "webgrid-selected-row",
        rowStyle: "webgrid-row-style",
        columns: grid.Columns(grid.Column("StudentID", "SMUId"),
                                grid.Column("StudentName", "Name"),
                                grid.Column("CourseName", "Course"),
                                grid.Column("InstructorName", "Professor"),
                                grid.Column("ExamLength", "ExamLength"),
                                grid.Column("SchedExamBeginTime", "Time In"),
                                grid.Column("SchedExamEndTime", "Time Out"),
                                grid.Column("Notes", "Notes"),
                                grid.Column("AppointmentStatus", "Status"),

                                //THIS IS WHat I'd like to display in a column...

                                        //if (model.AppointmentStatus == "Scheduled")
                                        //{
                                        //    html.ActionLink("Edit", "Edit", new { ID = item.CourseExamApptID }).ToString() + " | " +
                                        //    html.ActionLink("Delete", "Delete", new { ID = item.CourseExamApptID }).ToString() + " | " +
                                        //    html.ActionLink("Cancel", "Cancel", new { ID = item.CourseExamApptID }, new { onclick = "return confirm('Are you sure you'd like to cancel this Appointment?');" }).ToString()
                                        //}

                                        //html.ActionLink("Schedule", "Schedule", new { ID = item.CourseExamApptID }, new { onclick = "return confirm('Are you sure you'd like to schedule this Appointment?');" }).ToString()





                                //THIS IS MY ORIGINAL CODE THAT WORKS with only needing same column and link for every record...

                                //grid.ApptLinksWCancel(Html)


            )
         )
</div>

How do I accomplish this?

Thanks


Solution

  • You should be able to use a ternary expression ?: for this, as in:

    columns: grid.Columns(
        model.AppointmentStatus == "Scheduled" ? 
            grid.ApptLinksWCancel(Html) : grid.ApptLinksWSchedule(Html)
    ),
    

    Edit

    For something more complicated, you could add an extension method taking an extra parameter:

    public static WebGridColumn ApptLinks(this WebGrid grid, HtmlHelper html, string status)
    {
        if (status == "Schedule")
            return grid.ApptLinksWSchedule(html);
        else
            return grid.ApptLinksWCancel(html);
    }
    

    Use it in the same way:

    columns: grid.Columns(
        grid.ApptLinks(Html, model.AppointmentStatus),
        ...
    ),