Asp.net MVC2 - 表单绑定

时间:2011-02-17 15:23:50

标签: c# asp.net-mvc-2 model-binding

我不能为我的生活弄清楚我做错了什么。

我有一个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”属性不为空。

即使我不想在表单中明确列出其他属性,我如何在帖子中包含其他属性?

下图显示了发送到“索引”显示页面的值 enter image description here

下图显示POST的输出 Output From POST

3 个答案:

答案 0 :(得分:3)

如果您想要回发这些值,则需要在视图中将字段设为隐藏字段

Html.HiddenFor(m => m.searchFields[i].FilterOperator)

或者有某种工厂用默认值填充你的模型

答案 1 :(得分:1)

答案 2 :(得分:1)

  

如何包含其他属性   在帖子中,即使我不想   明确地在表格中列出它们?

您必须再次获取它们或将它们填入隐藏字段,并且基本上让用户定义您的只读数据。

这就是为什么我喜欢将PostModel作为ViewModel的属性。然后我的post动作方法只需要PostModel参数。否则,就像在您的示例中一样,您将返回此混合ViewModel / PostModel,您需要确定要使用的属性。