MVC 2 asp.net VC2010:哪里发生的“数据绑定”?
理解问题: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方法充满了true
或false
。
我不解地问:
我用的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_IndexViewModel
CheckBox1
返回的值应该存储在XModel
财产CheckBox1
?
经过大量的编辑和重新阅读您的文章后,我想我明白你在问什么。您的X_IndexViewModel
绑定到您创建的CheckBox
的原因是因为CheckBox
的名称与模型属性完全相同。他们都被命名为CheckBox1
。
这是ASP.NET MVC魔术发生的地方。它将模型属性与名称匹配的值相匹配,并且可以加载值。
所以当控件发布时,会发生相反的情况。使用不同的类来接收数据并不重要,因为它正在匹配属性名称和预期类型。由于数据将被发布到一个控制器,该控制器具有与HTML中的CheckBox
控件具有同名属性的模型,因此它会自动将该值放入。这一切都发生在MVC框架的幕后,我喜欢称它为MVC MAGIC SAUCE。
如果您想测试它,请采用您的确切示例,并将XModel
bool
属性名称更改为CheckBox2
。这些值不会自动被引发到接收模型中,因为属性名称不再与HTML的控件名称(ID)匹配。
您也可以使用您传入的原始模型来创建视图(X_IndexViewModel
)。将其更改为CheckBox2
并且HTML将不再自动反映模型中的值,因为CheckBox2
的模型属性与控件名称CheckBox1
不匹配。
以下是你可以看到有更多的例子和解释一些其他链接:
非常感谢你!!!!!我现在明白了!抱歉我的英语不好;-) – user415876 2010-08-13 05:14:35