2010-08-12 59 views
1

理解问题:MVC 2 asp.net VC2010:哪里发生的“数据绑定”?

1) “X_IndexViewModel” 类

public class X_IndexViewModel 
{ 
    public List<SelectListItem> CheckBox_1 { get; set; } 
    ... 
} 

2)XController.cs

public ActionResult Index() 
{ 
    X_IndexViewModel viewModel = new X_IndexViewModel 
    { 
     CheckBox_1 = new List<SelectListItem>() 
     { 
      new SelectListItem 
      { 
       Selected = true, 
       Text = "some text", 
       Value ="another text" 
      } 
     },  
     ... 
    } 
    return View(viewModel); 
} 

3)网站 “的Index.aspx” 它继承 “X_IndexViewModel”

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Test.ViewModels.X_IndexViewModel>" %> 
    ...  
    <!-- rendering a checkbox --> 
    <% foreach (var item in Model.CheckBox_1) { %> 
    <%: Html.CheckBox("CheckBox_1", item.Selected, new {id="CheckBox_1"}) %> 
     <label for="CheckBox_1<%: item.Text %>"><%: item.Text %></label> 
    <% } %> 
    ... 

4)“真正的”模型类“XModel”包含强制TA布尔来存储信息,用户是否选中复选框或不...

public class XModel 
{ 
    public bool CheckBox_1 {get; set;} 
    ... 
} 

5)和“XController.cs”

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Index(XModel model, FormCollection Form) 

我很惊讶的是,POST的参数model对于该复选框,ActionResult方法充满了truefalse

我不解地问:

我用的X_IndexViewModel类 (X_IndexViewModel viewModel = new X_IndexViewModel { ... }) 实例具有值(如选择= true或false等),以填补复选框。

然后是通过使用viewModel呈现的网站(其中viewModel是X_IndexViewModel类的实例)。 这工作正常,因为该网站继承X_IndexViwModel

当用户提交表单时,将使用[AcceptVerbs(HttpVerbs.Post)]ActionResult方法获取的此事件(事件事件)和XModel类属性填充复选框值。

所以我的问题是:

在什么地方了“X_IndexViewModel”和“XModel”之间的结合发生的呢?

其中的声明说:在X_IndexViewModelCheckBox1返回的值应该存储在XModel财产CheckBox1

回答

2

经过大量的编辑和重新阅读您的文章后,我想我明白你在问什么。您的X_IndexViewModel绑定到您创建的CheckBox的原因是因为CheckBox的名称与模型属性完全相同。他们都被命名为CheckBox1

这是ASP.NET MVC魔术发生的地方。它将模型属性与名称匹配的值相匹配,并且可以加载值。

所以当控件发布时,会发生相反的情况。使用不同的类来接收数据并不重要,因为它正在匹配属性名称和预期类型。由于数据将被发布到一个控制器,该控制器具有与HTML中的CheckBox控件具有同名属性的模型,因此它会自动将该值放入。这一切都发生在MVC框架的幕后,我喜欢称它为MVC MAGIC SAUCE

如果您想测试它,请采用您的确切示例,并将XModelbool属性名称更改为CheckBox2。这些值不会自动被引发到接收模型中,因为属性名称不再与HTML的控件名称(ID)匹配。

您也可以使用您传入的原始模型来创建视图(X_IndexViewModel)。将其更改为CheckBox2并且HTML将不再自动反映模型中的值,因为CheckBox2的模型属性与控件名称CheckBox1不匹配。

以下是你可以看到有更多的例子和解释一些其他链接:

  1. ​​
  2. ASP.NET MVC 2 Model Binding for a Collection
  3. 6 Tips for ASP.NET MVC Model Binding
+0

非常感谢你!!!!!我现在明白了!抱歉我的英语不好;-) – user415876 2010-08-13 05:14:35