Отображение данных в представлении в зависимости от того, какая кнопка нажата: ASP.NET MVC3 RAZOR - PullRequest
0 голосов
/ 21 февраля 2012

У меня есть представление «Планирование программ». Когда представление загружается с помощью GET, оно показывает список программ (в таблице), доступных в базе данных. Он перечисляет только 5 программ (макс) случайным образом. Имеются две кнопки

  1. Показать мартовские программы. При нажатии этой кнопки в таблице должны отображаться только те программы, которые запланированы на март месяц.

  2. Показать программы 2012 года. При нажатии этой кнопки в таблице должны отображаться только программы, запланированные на 2012 год.

Как нам этого добиться?

Примечание: Также, можете ли вы предложить решение, которое будет работать, если кнопка «Показать программы 2012» будет заменена на выпадающий список на годы.

Основано на принципе MVC: The UI logic belongs in the view. Input logic belongs in the controller. Business logic belongs in the model.

  1. Как мы можем добиться этого быстро?

  2. Как нам добиться этого стандартным способом (следуя принципу MVC, указанному выше)

GET Image

enter image description here

КОД

 namespace MyEventOriginIdentificationTest.Controllers
 {

 public class ProgramSchedule
 {
    public int ProgramID { get; set; }
    public string ProgramName { get; set; }
    public int ScheduledDate { get; set; }
    public int ScheduledMonth { get; set; }
    public int ScheduledYear { get; set; }
 }


public class ProgramTetecastController : Controller
{

    List<ProgramSchedule> wholeProgramList = new List<ProgramSchedule>()
                      {
                        new ProgramSchedule
                        {
                            ProgramID = 1,ProgramName = "2012-March-15",
                            ScheduledDate = 15,ScheduledMonth=3,ScheduledYear=2012
                        },
                        new ProgramSchedule
                        {
                            ProgramID = 2,ProgramName = "2012-March-16",
                            ScheduledDate = 16,ScheduledMonth=3,ScheduledYear=2012
                        },
                        new ProgramSchedule
                        {
                            ProgramID = 3,ProgramName = "2012-April-11",
                            ScheduledDate = 11,ScheduledMonth=4,ScheduledYear=2012
                        },
                        new ProgramSchedule
                        {
                            ProgramID = 4,ProgramName = "2013-Jan-05",
                            ScheduledDate = 5,ScheduledMonth=1,ScheduledYear=2013
                        }

                      };




    public List<ProgramSchedule> GetProgramsScheduleForMonth(int theMonth)
    {

        var monthProgram =
                                from prog in wholeProgramList
                                where prog.ScheduledMonth == theMonth
                                select prog;


        return ((List<ProgramSchedule>)monthProgram);

    }

    public List<ProgramSchedule> GetProgramsScheduleForYear(int theYear)
    {

        var yearProgram =
                                from prog in wholeProgramList
                                where prog.ScheduledYear == theYear
                                select prog;


        return ((List<ProgramSchedule>)yearProgram);

    }



    // GET: 
    public ActionResult MyProgramSchedule()
    {
        return View(wholeProgramList);
    } 

    // POST: 
    [HttpPost]
    public ActionResult MyProgramSchedule(FormCollection collection)
    {
        try
        {
            return RedirectToAction("ProgramSchedule");
        }
        catch
        {
            return View();
        }
    }


    }
}

VIEW

@model IEnumerable<MyEventOriginIdentificationTest.Controllers.ProgramSchedule>

@{
ViewBag.Title = "MyProgramSchedule";
}

<h2>MyProgramSchedule</h2>


<div>


<div id="sub-left" style="width:50%">

<input type="submit" value="Show March Programs" />
<input type="submit" value="Show 2012 Programs" />
<br />
</div>

<div id="sub-right" style="width:50%">

<table>
<tr>
    <th style="border:1px solid Teal; background-color:Gray">
        ProgramID
    </th>
    <th style="border:1px solid Teal; background-color:Gray">
        ProgramName
    </th>
    <th style="border:1px solid Teal; background-color:Gray">
        ScheduledDate
    </th>
    <th style="border:1px solid Teal; background-color:Gray">
        ScheduledMonth
    </th>
    <th style="border:1px solid Teal; background-color:Gray">
        ScheduledYear
    </th>
    <th></th>
</tr>

@foreach (var item in Model) {
<tr>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ProgramID)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ProgramName)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ScheduledDate)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ScheduledMonth)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ScheduledYear)
    </td>

</tr>
}

</table>

</div>



</div>

ЧТЕНИЕ

  1. Сохранить атрибуты кнопки в скрытом поле

  2. ASP.NET MVC3 RAZOR: получение скрытого поля Значение атрибута в контроллере (с помощью ViewModel)

  3. Проблема с несколькими представлениями в одном представлении

  4. Скрыть или отключить MVC3 ActionLinks в зависимости от значения ячейки

  5. ASP.NET MVC ActionFilterAttribute значение вставки перед привязкой модели


1 Ответ

2 голосов
/ 21 февраля 2012

Прежде всего Я бы никогда не разделил 2 метода для месяца и года, поскольку они абсолютно одинаковы, если вы измените сигнатуру метода, включив, например, дату from и to.

Имея это в виду, вы можете сделать что-то вроде:

public ActionResult ShowProgramsBetweenDates(DateTime? from, DateTime? to)
{
    if(from.HasValue && to.HasValue) {
        return View(GetProgramsBetweenDates(from.Value, to.Value));
    }

    return View(wholeProgramList);
} 

public IEnumerable<ProgramSchedule> GetProgramsBetweenDates(DateTime from, DateTime to)
{
    return from prog in wholeProgramList
           where prog.ScheduledDate >= from && prog.ScheduledDate <= to
           select prog;
}

и ваши кнопки будут выглядеть примерно так:

@using(Html.BeginForm("ShowProgramsBetweenDates", "ProgramTetecast"))
{
    <input type="button" value="Show March Programs" 
           data-from="01-03-2012" data-to="31-03-2012" />
    <input type="button" value="Show 2012 Programs" 
           data-from="01-01-2012" data-to="31-12-2012" />

    <input type="hidden" id="from" value="" />
    <input type="hidden" id="to" value="" />
}

и простой JQuery, чтобы помочь

$('form input[type="button"]').on('click', function() { // for all buttons in the form

    $('#from').val($(this).attr('data-from')); // set #from with date-from
    $('#to').val($(this).attr('data-to')); // set #to with date-to

    $(this).closest('form').submit();  // submit the form

});

Как правило , и, чтобы помочь вам в течение всего срока службы приложения, вы никогда не должны иметь более одного значения для даты, нет необходимости вразделите даты в «таблице», так как вы можете извлечь все, что вам нужно, например, из поля Date

, ваш класс может быть просто как

public class ProgramSchedule
{
  public ProgramSchedule() {} // Always add an empty constructor
  public int ProgramID { get; set; }
  public string ProgramName { get; set; }
  public int ScheduledDate { get; set; }
}

, поэтому ваш DataObject будет выглядеть примерно так::

List<ProgramSchedule> wholeProgramList = new List<ProgramSchedule>()
    {
        new ProgramSchedule
        {
            ProgramID = 1, ProgramName = "2012-March-15",
            ScheduledDate = new DateTime(2012, 3, 15)
        },
        new ProgramSchedule
        {
            ProgramID = 2, ProgramName = "2012-March-16",
            ScheduledDate = new DateTime(2012, 3, 16)
        },
        new ProgramSchedule
        {
            ProgramID = 3, ProgramName = "2012-March-11",
            ScheduledDate = new DateTime(2012, 3, 11)
        },
        new ProgramSchedule
        {
            ProgramID = 4, ProgramName = "2012-January-5",
            ScheduledDate = new DateTime(2012, 1, 5)
        },
    };

и в вашем представлении вы просто делаете:

@foreach (var item in Model) {
<tr>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ProgramID)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ProgramName)
    </td>
    <td style="border:1px solid Teal">
        @Html.DisplayFor(modelItem => item.ScheduledDate)
    </td>
    <td style="border:1px solid Teal">
        @item.ScheduledDate.toString("MMM")
    </td>
    <td style="border:1px solid Teal">
        @item.ScheduledDate.ToString("yyyy")
    </td>
</tr>
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...