2011-05-03 61 views
5

我有一个使用Razor的MVC3应用程序,并且我创建了一个内部呈现局部视图的视图。这是主视图的样子:在不使用AJAX的情况下重新加载ASP.NET MVC3部分视图

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

@* Other HTML elements *@ 

里面的_SearchFilters局部视图我有一个表单元素中下列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保持它们的状态,即用户选择的值,当View重新载入已过滤的数据时。

有没有办法做到这一点,而不使用AJAX?

UPDATE

视图模型如下:

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

}

感谢

弗朗西斯

+0

为什么你想这样做没有AJAX? – BentOnCoding 2011-05-12 02:39:00

回答

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" }) 
+0

感谢您的答案,但它不起作用。什么是x.ID字段? – CiccioMiami 2011-05-13 08:37:39

+0

@francesco ..我现在编辑它应该是t.value。基本上MonthList.Select将返回IEnumerable和SelectListItem,它将在Model中有selected = tru。月份与其价值匹配 – ZeNo 2011-05-13 20:11:20

1

没有Ajax不是,否则你将不得不重新发布整个形式。 MVC是一个不像WinForms应用程序那样动态的Web框架。您必须将更改发布到您的控制器并重新加载页面以进行必要的更改,或使用ajax来重新加载这些更改。

+0

感谢您的回答。你如何告诉DropDownList HTML助手我想要一个默认选择值(在这种情况下是selectedYear和selectedMonth)? – CiccioMiami 2011-05-03 09:26:21

+0

@Francesco:正如我在本文的回答中所写的那样 - 所选值可作为SelectList构造函数的参数提供。 HTH – 2011-05-12 00:09:22

2

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

我会建议你使用编辑器模板,而不是渲染的谐音,因为这虽然将确保下拉菜单的正确命名并最终保留选择的值:

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

@Darin Dimitrov:非常感谢。我目前将视图模型(基本上选中年份和选定月份)传递给控制器​​上的操作方法,然后将它们传递回视图(主要用于向用户显示dtata引用的哪个年份和月份)。我如何告诉DropDownList HTML助手我想要一个默认选择值(在这种情况下是selectedYear和selectedMonth)? – CiccioMiami 2011-05-03 09:25:06

+1

@Francesco,如果您使用的编辑器模板名称正确,这些下拉列表将自动完成。如果你不这样做,你可以指定选择的值作为'SelectList'构造函数的第四个参数。 – 2011-05-03 09:26:58

+0

@Darin Dimitrov:我会按照你的建议创建一个编辑器模板。然而,问题(我认为它不相关)是与月份相关的DropdownList是根据当年的选择 – CiccioMiami 2011-05-03 09:30:27

1

你可以为年提供的默认值和属性(将在第一个请求中选择)并绑定这些属性,而不是您提供的硬编码启动值。

所以不是:

@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将保留这些值)。所以你应该确保这些值在后续提交后不会被默认值覆盖。