你是对的,这是工作中的模型绑定。
当您使用 HtmlHelpers 时,绑定几乎会自动发生,例如:
@Html.TextboxFor(model => model.PropertyName)
这条线实际上创造了一些像这样的东西:
<input type="textbox" id="Modelobject_PropertyName" name="ModelObject.PropertyName" />
然后,当您提交表单时,DefaultModelBinder
能够反序列化 POST 值并创建给定类型的对象(至少它会尝试),如果找不到相应的条目,则该属性将为 null,如果条目没有对应的属性,它将被忽略(除非你有其他参数)。
您可以阅读这篇文章,它有点旧,但仍然非常准确。
例如:
假设您有一个简单的对象:
public class IndexModel
{
public string MyProperty { get; set; }
public bool MyCheckbox { get; set; }
}
一个简单的控制器:
public class TestingController : Controller
{
[OutputCache(Duration=0, NoStore = true)]
public ActionResult Index()
{
return View(new IndexModel { MyProperty = "hi" });
}
[HttpPost]
[OutputCache(Duration=0, NoStore = true)]
public ActionResult Index(IndexModel model)
{
model.MyProperty += "!";
ModelState.Clear();
return View(model);
}
}
和一个简单的观点:
@model MvcApp.Models.IndexModel
@using (Html.BeginForm())
{
<div>
@Html.LabelFor(model => model.MyProperty)<p />
@Html.TextBoxFor(model => model.MyProperty)
</div>
<div>
@Html.LabelFor(model => model.MyCheckbox)<p />
@Html.CheckBoxFor(model => model.MyCheckbox)
</div>
<input type="submit" />
}
当您提交表单时,您将看到模型已完全重新创建。
如果您不想显示属性的实际值,但仍需要保留它:
@Html.HiddenFor(model => model.MyProperty)
这将生成一个隐藏字段,该字段将被回发并因此保留。
快乐编码!