TextBoxFor显示初始值,而不是从代码更新的值
我有一个MVC应用程序,显示一个值。 这是控制器:
public ActionResult Index(DataSites DataSiteList) { if (DataSiteList.Latitude != null) { DataSites test = new DataSites(); test.Latitude = "LATITUDE"; return View(test); } return View(DataSiteList); } public ActionResult SomeInformation() { DataSites test1 = new DataSites(); test1.Latitude = "LATITUDE2"; return RedirectToAction("Index", test1); }
风景:
@model miniproj2.Models.DataSites <p> @Html.TextBoxFor(x => x.Latitude) </p>
而模型:
public class DataSites { public string Latitude { get; set; } }
当我到/ Home / SomeInformation时, DataSites
的Latitude
属性设置为“LATITUDE2”。 然后redirect到控制器中的Index()
动作,将属性设置为“LATITUDE”并返回视图。
显示视图时,显示redirect中设置的值“LATITUDE2”。 不应该显示“LATITUDE”吗?
你的问题是(一步一步)
- 您的
SomeInformation()
方法将test1.Latitude
的值test1.Latitude
为“LATITUDE2”。 - 然后,使用接受对象的
RedirectToAction
的重载将该模型传递给您的Index()
方法。 在内部,它使用reflection来build立一个基于你的模型属性的RouteValueDictionary
(在这种情况下,它的简单latidute="LATITUDE2"
)。 - 当你点击
Index
方法时,模型被DefaultModelBinder
绑定,现在DataSiteList.Latitude
的值是“LATITUDE2”(这就是你inputif
块的原因) - 在绑定过程中,
DefaultModelBinder
将Latitude
的ModelState
值设置为“LATITUDE2”。 任何尝试设置“Latitude
的值现在都被忽略,因为视图使用ModelState
值来呈现控件。
不清楚你在这里做什么。 您可以通过添加ModelState.Clear();
来使其按预期工作ModelState.Clear();
作为你的Index()
方法的第一行。 这将清除所有现有的ModelState
值,您现在可以将该值设置为“LATITUDE”。
但是你的if
块是没有意义的。 也许你只是在做某种testing,但你也可以从Index()
方法中删除参数,并在方法中初始化一个新的DataSites
实例。
编辑
为了给出更多的信息,一旦设置了ModelState
,为什么更新模型属性没有任何影响。
想象一下你有一个表单来收集模型包含int Age
用户信息。 用户被要求input他们的年龄,并有人input“我下周五”! 当然,这不会绑定到一个int,所以DefaultModelBinder
添加值( attemptedValue
),并添加一个ModelStateError
。
当视图返回时,通常会显示一条错误消息,如“字段时间必须是数字”。 如果呈现控件的html助手使用了模型值,那么它将显示“0”(int的默认值)。 如果用户在文本框中看到“0”,并且接下来显示一个消息,说它一定是一个数字( 什么!但是零是一个数字,什么是我碰到的? 相反,帮手使用ModelState
的值,现在用户看到“我是下周五!” 和一个相关的错误消息,对于这个值是有意义的。
所以,即使你的想法是“这不合逻辑” ,实际上这个行为有一些逻辑。
你没有设置高度。 它将为空,所以代码将永远不会进入该块,并将Lattitude设置为“LATTITUDE”
if (DataSiteList.Altitude != null) { DataSites test = new DataSites(); test.Latitude = "LATITUDE"; return View(test); }