我是ASP.NET MVC的新手,所以这可能有一个明显的答案。现在我在视图中有一个带有大量输入控件的表单,所以我有一个看起来像这样的动作:
public ActionResult MyAction(string formItemOne, int? formItemTwo, etc...)
它有十几个参数,非常难看。我正试图将其改为:
public ActionResult MyAction(FormCollection formItems)
然后动态解析项目。但是当我更改为FormCollection时,表单项不再通过回发“自动”记住它们的值。为什么更改为FormCollection会更改此行为?我能做些什么来让它再次自动工作?
感谢您的帮助,
~Justin
答案 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(),我认为这些值将被保留。