使用命名参数作为控制器输入与FormCollection

时间:2009-10-25 18:44:57

标签: asp.net-mvc

我是ASP.NET MVC的新手,所以这可能有一个明显的答案。现在我在视图中有一个带有大量输入控件的表单,所以我有一个看起来像这样的动作:

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...)

它有十几个参数,非常难看。我正试图将其改为:

public ActionResult MyAction(FormCollection formItems)

然后动态解析项目。但是当我更改为FormCollection时,表单项不再通过回发“自动”记住它们的值。为什么更改为FormCollection会更改此行为?我能做些什么来让它再次自动工作?

感谢您的帮助,

~Justin

3 个答案:

答案 0 :(得分:4)

另一种解决方案是使用模型而不是操纵原始值。像这样:

class MyModel
{
  public string ItemOne { get; set; }
  public int? ItemTwo { get; set; }
}

然后使用此代码:

public ActionResult MyAction(MyModel model)
{
  // Do things with model.

  return this.View(model);
}

在您看来:

<%@ Page Inherits="System.Web.Mvc.ViewPage<MyModel>" %>
<%= Html.TextBox("ItemOne", Model.ItemOne) %>
<%= Html.TextBox("ItemTwo", Model.ItemTwo) %>

答案 1 :(得分:1)

要用一个参数替换大的参数列表,请使用view model。如果在POST之后将此模型返回到您的视图,那么您的视图将记住发布的值。

视图模型只是一个将您的操作参数作为公共属性的类。例如,您可以执行以下操作,替换:

public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...)

public ActionResult MyAction(FormItems formItems)
{
  //your code...
  return View(formItems);
}

其中FormItems是

public class FormItems
{
  public property string formItemOne {get; set;}
  public property int? formItemTwo {get; set;}
}

您可以在Stephen Walter的帖子ASP.NET MVC Tip #50 – Create View Models中看到一个完整的例子。

答案 2 :(得分:0)

也许是因为它们不再神奇地插入到ModelState字典中。尝试将它们插入那里。

如果您使用UpdateModel()或TryUpdateModel(),我认为这些值将被保留。