我不能为我的生活弄清楚我做错了什么。
我有一个SearchModel
类,我的视图继承自
public class SearchModel
{
public String Something { get; set; }
public List<SearchField> SearchFields { get; set; }
}
public class SearchField
{
[XmlIgnore]
public Boolean Include { get; set; }
[XmlAttribute("Required")]
public Boolean Required { get; set; }
[XmlAttribute("Field")]
public String FieldName { get; set; }
[XmlText]
public String DisplayName { get; set; }
[XmlIgnore]
public FilterMethod FilterOperator { get; set; }
[XmlIgnore]
public String Value { get; set; }
}
我有一个名为SearchController
public ActionResult Index()
{
SearchModel model = new SearchModel
{
Something = "Hello",
SearchFields = customer.Config.Fields
};
return View(model);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Index(SearchModel searchModel)
{
return View("Index", searchModel);
}
SearchController索引页面用于呈现字段
<% using (Html.BeginForm())
{%>
<%= Html.TextBox("Something", Model.Something) %>
<% for (int i = 0; i < Model.SearchFields.Count; i++)
{
%>
<%= Html.Label(Model.SearchFields[i].DisplayName) %>
<%= Html.DropDownListFor(x => x.SearchFields[i].FilterOperator, Model.SearchFields[i].FilterOperator.ToSelectList(), new { @class = "textField" })%>
<%= Html.TextBoxFor(x => x.SearchFields[i].Value) %>
<%= Html.ValidationMessageFor(x => x.SearchFields[i].Value) %>
<% } %>
<button type="submit" value="Search" class="SearchBtn">
Search</button>
<% } %>
当我修改SearchField .Value属性的值并按下提交按钮时,它会发布到public ActionResult Index(SearchModel searchModel)
方法。
searchModel变量包含集合SearchFields
,但只有“Value
”和“FilterOperator
”属性不为空。
即使我不想在表单中明确列出其他属性,我如何在帖子中包含其他属性?
下图显示了发送到“索引”显示页面的值
下图显示POST的输出
答案 0 :(得分:3)
如果您想要回发这些值,则需要在视图中将字段设为隐藏字段
Html.HiddenFor(m => m.searchFields[i].FilterOperator)
或者有某种工厂用默认值填充你的模型
答案 1 :(得分:1)
看看这些帖子。它可能对你有用
http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/
http://haacked.com/archive/2008/10/23/model-binding-to-a-list.aspx
答案 2 :(得分:1)
如何包含其他属性 在帖子中,即使我不想 明确地在表格中列出它们?
您必须再次获取它们或将它们填入隐藏字段,并且基本上让用户定义您的只读数据。
这就是为什么我喜欢将PostModel作为ViewModel的属性。然后我的post动作方法只需要PostModel参数。否则,就像在您的示例中一样,您将返回此混合ViewModel / PostModel,您需要确定要使用的属性。