【问题标题】:Reloading an ASP.NET MVC3 Partial View without using AJAX在不使用 AJAX 的情况下重新加载 ASP.NET MVC3 部分视图
【发布时间】:2011-08-17 13:32:03
【问题描述】:

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

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

@* Other HTML elements *@

_SearchFilters 部分视图中我在 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" />

我希望在 提交 后两个 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>();
        }
    }

}

谢谢

弗朗西斯科

【问题讨论】:

  • 你为什么要在没有 AJAX 的情况下这样做?

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


【解决方案1】:

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

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

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

【讨论】:

  • @Darin Dimitrov:这很清楚,谢谢。我目前将视图模型(基本上是 selectedYear 和 selectedMonth)传递给控制器​​上的 action 方法,然后将它们传递回 View(主要是为了向用户显示 dtata 所指的年份和月份)。如何告诉 DropDownList HTML 助手我想要一个默认的选择值(在本例中为 selectedYear 和 selectedMonth)?
  • @Francesco,如果您使用正确命名这些下拉列表的编辑器模板,这将自动完成。如果不这样做,您可以将所选值指定为 SelectList 构造函数的第四个参数。
  • @Darin Dimitrov:我会听从您的建议并创建一个编辑器模板。然而问题(我认为它不相关)是与月份相关的 DropdownList 是根据年份的选择填充的
  • @Francesco,确实是,级联下拉菜单。您可能需要在视图模型上使用 MonthsList 属性(与使用 YearsList 的方式相同),该属性最初将初始化为 Enumerable.Empty&lt;SelectListItem&gt;(),但在基于所选年份值的 POSTback 操作中,您可以填充月份列表属性。这样,当您渲染视图时,第二个下拉菜单也将具有相应的值。
  • @Darin Dimitrov:从我发布的代码中可以看出(我省略了 javascript),我的应用程序已经实现了这种行为。用户第一次选择年份和月份(2011 年和 3 月)。回发后,我可以将年份 DDL 设置为 selectedYear(2011) 并相应地填充月份 DDL。问题是月份 DDL 显示一月而不是三月...
【解决方案2】:

我目前没有 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" })

【讨论】:

  • 感谢您的回答,但它不起作用。 x.ID 字段是什么?
  • @francesco.. 我现在编辑它应该是 t.value。基本上 MonthList.Select 将返回和 IEnumerable SelectListItem 并且当 Model.month 与其值匹配时它将选择=tru
【解决方案3】:

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

【讨论】:

  • 感谢您的回答。你如何告诉 DropDownList HTML 助手我想要一个默认的选择值(在本例中为 selectedYear 和 selectedMonth)?
  • @Francesco:正如我在对这篇文章的回答中所写的那样 - 可以将所选值作为参数提供给 SelectList 构造函数。 HTH
【解决方案4】:

您可以为 YearMonth 属性(在第一次请求时选择)提供默认值,并绑定它们而不是您提供的硬编码启动值。

所以而不是:

@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 会保留这些值)。因此,您应该确保在后续提交后这些值不会被默认值覆盖。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多