提交后 MVC5 在文本框中丢失值
MVC5 Lost value in Textbox after Submit
我想澄清一件事关于 MVC5 Razor Views。
有人告诉我,我不必在剃须刀视图中使用 HTML 助手(@Html.EditorFor、@Html.TextBoxFor),它仍然可以工作。
控制器代码
[HttpPost]
public ActionResult Create(Models.TestObj obj)
{
ViewBag.TestStr = string.Format("You typed: {0} {1}", obj.FirstName, obj.LastName);
return View(obj);
}
剃刀视图
@using (Html.BeginForm())
{
<div>
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control", style = "width: 120px;" } })
<input class="form-control text-box single-line" id="LastName" name="LastName" style="width: 120px;" type="text">
<input type="submit" name="submit" value="Filter" / >
</div>
@ViewBag.TestStr
}
但是当我像上面那样实际测试时,'LastName' 文本框中输入的值并没有被保留。我可以在我的控制器中捕获两个文本框值。但是回发后,'LastName' 文本框中的值丢失了。使用 HTMLHelper 创建的文本框虽然没有丢失值。
我是做错了什么还是应该是这样的?如果我想保留提交的值,是否必须在 MVC5 的 RazorViews 中使用 HtmlHelpers?
您没有将第二个输入绑定到 LastName
的值,只是设置了它的 name
属性。如果您检查生成的 html,您会注意到第一个具有 value
属性,而第二个没有。
您需要像对 FirstName
所做的那样使用 EditorFor()
(或 TextBoxFor()
),它会生成正确的 value
属性(以及其他 data-val-*
使用客户端验证所必需的属性)。
旁注:您也可以使用
<input name="LastName" ..... value="@Model.LastName"` />
但是这不会考虑 ModelState
值
什么是 "postback"?听起来您正试图从 WebForms 的角度考虑这一点,其中服务器端控件在幕后有很多管道做事。
简而言之,您的视图中没有任何代码实际将值放入 input
。当使用 HTML 助手时,虽然生成的客户端标记是相同的(因此,下一个控制器操作的 post 是相同的),但不同的是 HTML 助手会将控件绑定到提供给视图的模型。
HTML 本身不会那样做。但是,您可以手动执行此操作:
<input value="@Model.LastName" class="form-control text-box single-line" id="LastName" name="LastName" style="width: 120px;" type="text">
^--- right here
您需要在模型中添加文本框,并在视图 index.cshtml 中添加 link 文本框,如下所示: m = m.Variable_name_from_your_model
查看此站点:
https://mvcstepbystep.wordpress.com/how-to-update-a-c-mvc-textbox-from-jquery/
我想澄清一件事关于 MVC5 Razor Views。
有人告诉我,我不必在剃须刀视图中使用 HTML 助手(@Html.EditorFor、@Html.TextBoxFor),它仍然可以工作。
控制器代码
[HttpPost]
public ActionResult Create(Models.TestObj obj)
{
ViewBag.TestStr = string.Format("You typed: {0} {1}", obj.FirstName, obj.LastName);
return View(obj);
}
剃刀视图
@using (Html.BeginForm())
{
<div>
@Html.EditorFor(model => model.FirstName, new { htmlAttributes = new { @class = "form-control", style = "width: 120px;" } })
<input class="form-control text-box single-line" id="LastName" name="LastName" style="width: 120px;" type="text">
<input type="submit" name="submit" value="Filter" / >
</div>
@ViewBag.TestStr
}
但是当我像上面那样实际测试时,'LastName' 文本框中输入的值并没有被保留。我可以在我的控制器中捕获两个文本框值。但是回发后,'LastName' 文本框中的值丢失了。使用 HTMLHelper 创建的文本框虽然没有丢失值。
我是做错了什么还是应该是这样的?如果我想保留提交的值,是否必须在 MVC5 的 RazorViews 中使用 HtmlHelpers?
您没有将第二个输入绑定到 LastName
的值,只是设置了它的 name
属性。如果您检查生成的 html,您会注意到第一个具有 value
属性,而第二个没有。
您需要像对 FirstName
所做的那样使用 EditorFor()
(或 TextBoxFor()
),它会生成正确的 value
属性(以及其他 data-val-*
使用客户端验证所必需的属性)。
旁注:您也可以使用
<input name="LastName" ..... value="@Model.LastName"` />
但是这不会考虑 ModelState
值
什么是 "postback"?听起来您正试图从 WebForms 的角度考虑这一点,其中服务器端控件在幕后有很多管道做事。
简而言之,您的视图中没有任何代码实际将值放入 input
。当使用 HTML 助手时,虽然生成的客户端标记是相同的(因此,下一个控制器操作的 post 是相同的),但不同的是 HTML 助手会将控件绑定到提供给视图的模型。
HTML 本身不会那样做。但是,您可以手动执行此操作:
<input value="@Model.LastName" class="form-control text-box single-line" id="LastName" name="LastName" style="width: 120px;" type="text">
^--- right here
您需要在模型中添加文本框,并在视图 index.cshtml 中添加 link 文本框,如下所示: m = m.Variable_name_from_your_model
查看此站点: https://mvcstepbystep.wordpress.com/how-to-update-a-c-mvc-textbox-from-jquery/