Перезагрузка ASP.NET MVC3 Partial View без использования AJAX - PullRequest
5 голосов
/ 03 мая 2011

У меня есть приложение MVC3 с Razor, и я создал вид, который внутри отображает частичное представление. Вот так выглядит основной вид:

@{Html.RenderPartial("_SearchFilters", Model.SearchFilters);}

@* Other HTML elements *@

Внутри _SearchFilters Partial View У меня есть следующие DropDownLists внутри элемента Form:

Choose Year
          @Html.DropDownListFor(m => m.Year, new SelectList(Model.YearsList, "Value", "Text"), DateTime.Now.Year)

Choose Month
          @Html.DropDownListFor(m => m.Month, new SelectList(Model.MonthsList, "Value", "Text"), Model.Month.ToString(), new { @disabled = "disabled" })


       <input type="submit" value="Display" />

Я хотел бы, чтобы при Submit два DropDownLists сохраняли свой статус, а именно значение , выбранное пользователем , когда представление перезагружается с отфильтрованным данные.

Есть ли способ сделать это без использования AJAX?

UPDATE

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

public class TableSearchFiltersViewModel
{
    public bool YTM { get;  set; }

    public int? Month { get; set; }

    public int? Year { get; set; }

    public IEnumerable<SelectListItem> YearsList
    {
        get
        {
        return Enumerable.Range(2011, (DateTime.Now.Year - 2011 + 4)).Select(m => new SelectListItem
        {
            Value = m.ToString(),
            Text = m.ToString(),
        }).OrderBy(m => m.Value);
        }
    }

    public IEnumerable<SelectListItem> MonthsList
    {
        get
        {
           return Enumerable.Empty<SelectListItem>();
        }
    }

}

Спасибо

Francesco

Ответы [ 4 ]

2 голосов
/ 03 мая 2011

Когда вы отправляете форму соответствующему действию контроллера, это действие должно принимать в качестве входного параметра некоторую модель представления. Свойства этой модели представления будут связаны с полями ввода, содержащимися в форме, включая выбранное значение двух раскрывающихся списков. Тогда действие контроллера может вернуть то же представление, которое сохранит выбранные значения раскрывающихся списков.

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

@Html.EditorFor(x => x.SearchFilters)
1 голос
/ 12 мая 2011

В данный момент у меня нет IDE, поэтому я не могу проверить, но это может сработать:

Выберите месяц

EDIT:

 @Html.DropDownListFor(m => m.Month, 
Model.MonthsList.Select(
        t => new SelectListItem {
                 Text = t.Name,
                 Value = t.Value,
                 Selected = t.Value == Model.Month,
        },

 Model.Month.ToString(), new { @disabled = "disabled" })
1 голос
/ 12 мая 2011

Вы можете предоставить значения по умолчанию для Год и Месяц свойств (которые будут выбраны при первом запросе) и связать их вместо предоставленных вами жестко запрограммированных значений запуска.

Так что вместо:

@Html.DropDownListFor(m => m.Year, new SelectList(Model.YearsList, "Value", "Text"), DateTime.Now.Year)

Что, кстати, кажется ошибочным, поскольку выбранное значение (которое, я полагаю, DateTime.Now.Year в вашем примере) должно быть предоставлено как конструктор SelectList (вместо этого аргумента DropDownListFor ). Метод DropDownListFor не имеет аргумента «выделенное значение».

Вы можете написать:

@Html.DropDownListFor(m => m.Year, new SelectList(Model.YearsList, "Value", "Text", Model.Year))

и аналогично во втором раскрывающемся списке.

При этом в раскрывающихся списках сохраняются выбранные значения при визуализации с использованием опубликованной модели (поскольку они будут содержать Model.Year и Model.Month). Поэтому вы должны убедиться, что эти значения не будут перезаписаны значениями по умолчанию после последующих отправок.

1 голос
/ 03 мая 2011

Без ajax нет, или вам придется перепечатывать всю форму.MVC - это веб-фреймворк, который не является динамическим как приложение winforms.Вам нужно будет опубликовать изменения на вашем контроллере и перезагрузить страницу с необходимыми изменениями, или использовать ajax для перезагрузки этих изменений.

...