在不使用AJAX的情况下重新加载ASP.NET MVC3部分视图

时间:2011-05-03 09:06:48

标签: c# asp.net-mvc-3 razor partial-views

我有一个使用Razor的MVC3应用程序,我创建了一个内部呈现部分视图的视图。这就是主视图的样子:

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

@* Other HTML elements *@

_SearchFilters Partial View 中,我在Form元素中有以下DropDownLists:

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" />

我希望在提交后,当重新加载View时,两个 DropDownLists 会保持其状态,即用户选择的使用过滤后的数据。

有没有办法不使用AJAX呢?

更新

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>();
        }
    }

}

由于

弗朗西斯

4 个答案:

答案 0 :(得分:2)

当您将表单提交给相应的控制器操作时,此操作应将某些视图模型作为输入参数。此视图模型的属性将从包含在表单中的输入字段绑定,包括两个下拉列表的选定值。然后控制器操作可以返回相同的视图,该视图将保留下拉框的选定值。

我建议您使用编辑器模板,而不是渲染部分,因为这将确保正确命名下拉列表并最终保留选定的值:

@Html.EditorFor(x => x.SearchFilters)

答案 1 :(得分:1)

没有ajax,或者你将不得不重新发布整个表格。 MVC是一个Web框架,它不像winforms应用程序那样动态。您必须将更改发布到控制器并使用必要的更改重新加载页面,或使用ajax重新加载这些更改。

答案 2 :(得分:1)

您可以提供属性的默认值(在第一个请求时选择)并绑定它们而不是您提供的硬编码启动值。< / p>

所以而不是:

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

哪个btw似乎是错误的,因为选择的值(我认为 DateTime.Now.Year 在你的例子中)应该作为 SelectList 的构造函数提供(而不是 DropDownListFor 方法的)参数。 DropDownListFor方法没有“选定值”参数。

你可以写:

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

类似于第二次下拉列表。

这将使下拉列表在使用已发布模型呈现时保持所选值(因为Model.Year和Model.Month将保留这些值)。因此,您应确保在后续提交后,这些值不会被默认值覆盖。

答案 3 :(得分:1)

我目前没有IDE,所以无法测试,但这可能有效:

选择月

编辑:

 @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" })