当MVC运行时ActionMethod,它将填充ModelState字典并使用a ModelBinder来构建ActionMethod参数(如果有的话).它这样做是两个GET和POST.这是有道理的.
后ActionMethod成功已经跑了,视图是使用所提供的剃刀,这在我的情况下,使用尽可能多的呈现HtmlHelper通话成为可能.到现在为止,您可能会想,"我知道MVC是如何工作的".等等,我到了那里.
当我们使用例如@Html.TextFor(m => m.Name)MVC时,使用可以在这里呈现标记的代码.
有趣的部分是在我们找到的文件的末尾:
switch (inputType)
{
case InputType.CheckBox:
// ... removed for brevity
case InputType.Radio:
// ... removed for brevity
case InputType.Password:
// ... removed for brevity
default:
string attemptedValue =
(string)htmlHelper.GetModelStateValue(fullName, typeof(string));
tagBuilder.MergeAttribute("value", attemptedValue ??
((useViewData)
? htmlHelper.EvalString(fullName, format)
: valueParameter), isExplicitValue);
break;
}
Run Code Online (Sandbox Code Playgroud)
这意味着它Modelstate用于获取提供的值Model.这对于a是有意义的,POST因为当存在验证错误时,您希望MVC使用用户已经提供的值来呈现视图.文档还说明了这种行为,StackOverflow上有几篇帖子证实了这一点.但它只是为说明POST,如能上可以看到这个线程,例如
但是,当为一个视图渲染时,也会使用此代码 …
我有一个在线表格.例如,它要求名字和姓氏.当他们提交时,我将他们发送到另一个视图.第二个视图还有一些文本框(密码,电子邮件地址,用户名),但它也有名字和姓氏.如果他们填写第一个表格并填写名字/姓氏,我希望第二个表格显示这些值,因为他们已经填写了.
在第一种形式中,我将所有填写的信息放入TempData ["entry"]
在第二种形式我正在做这个检查.
if (TempData["entry"] != null)
{
var _model = (AccountInformationModel)TempData["entry"];
ViewData["_firstName"] = _model.NameFirst;
ViewData["_lastName"] = _model.NameLast;
}
return View("Register");
Run Code Online (Sandbox Code Playgroud)
我想在我看来,我对如何在文本框中显示这些数据感到困惑.在我看来,我有这个,但它似乎没有工作.
<div class="editor-label">
@Html.LabelFor(m => m.FirstName)
</div>
<div class="editor-field">
@Html.TextBox("FirstName", ViewData["FirstName"])
@Html.ValidationMessageFor(m => m.FirstName)
</div>
Run Code Online (Sandbox Code Playgroud)
显然是......
@Html.TextBox("FirstName", ViewData["FirstName"])
Run Code Online (Sandbox Code Playgroud)
不工作..