【发布时间】:2011-04-22 13:32:32
【问题描述】:
这是我的模型:
public class IndexViewModel
{
public FilterConditions conditions { get; set }
public IEnumerable<SelectListItem> Countries { get; set }
}
public class FilterConditions
{
public string condition11 { get; set }
// ...
}
我有一个像这样的Index 操作方法:
public ActionResult Index()
{
var model = new IndexViewModel();
// fill the model here with default values
return View(model);
}
视图呈现一个带有过滤条件的表单作为输入类型。
现在我希望通过该操作方法处理从该表单返回的帖子:
[HttpPost]
public ActionResult Index(FilterConditions model)
{
// do some magic with model and return another view here
}
这确实有效(我在方法中放置了一个断点,它被调用),但我的模型的属性始终为空(默认值),而它们应该包含表单发布的值。
当我像这样修改动作方法时:
[HttpPost]
public ActionResult Index(IndexViewModel model)
{
// do some magic with model.conditions and return another view here
}
一切正常,但这不是“正确的”(恕我直言),因为我不需要返回时的“国家”列表,我只需要选择的国家(这是条件之一)。
在不必将整个原始视图模型作为输入参数的情况下,有什么好的(最佳实践)方法来完成这项工作?
顺便说一句,我使用的是 ASP.NET MVC 2(我认为这并不重要,因为我认为这与 MVC 3 中的问题相同,但我并不完全确定)。
(我一直在互联网上寻找有关 asp.net mvc 中的下拉列表和视图模型的“最佳实践”,但我发现的不同建议并没有真正相互一致,而且很多内容也已经过时了.我没有找到一个“官方”的最佳实践。我希望我朝着正确的方向前进(将列表作为我的视图模型的一部分),如果我不是,请随时纠正我的问题。如果您知道的话,也请随时向我指出“认可的最佳实践”。)
更新:
我发现我可以使用带有“filterconditions”前缀的 [Bind] 属性。这确实适用于这种观点。但是我最初的问题(我承认,它没有包含在我的问题中)没有解决。
碰巧这个特定的操作方法也是从另一个没有那个前缀的视图(它是一个 ajax 调用)调用的,在这种情况下它现在不再工作了。有什么建议吗?
【问题讨论】:
-
听起来您想以两种方式称呼它...也许您可以每种方式都有一个参数,然后根据设置的值选择要使用的参数。
-
您是使用 AjaxForm 进行 ajax 调用还是使用 jQuery ajax?
-
@nEEbz:我使用 jQuery ajax,但这没关系,因为我也有不使用 ajax 的问题。
-
我觉得有点难以理解。如果是
public ActionResult Index(IndexViewModel model),您是否尝试过仅发送过滤条件而不发送国家/地区?我认为模型绑定器将智能地仅绑定FilterConditions conditions并将国家列表保留为空。 -
@nEEbz:我只发送条件。这实际上是通过表单的发布自动完成的,并且由于表单上的字段仅来自 filterConditions(模型的其他字段用于填充我的 DropDownLists),因此只会发送这些字段。我的问题是,如果我只指定
FilterConditions model作为操作方法的参数,默认模型绑定器不会将它们解析为模型对象。但是,当我指定FilterConditions filterConditions时它确实有效(请参阅我的答案)。
标签: c# asp.net-mvc viewmodel