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时, DataSitesLatitude属性设置为“LATITUDE2”。 然后redirect到控制器中的Index()动作,将属性设置为“LATITUDE”并返回视图。

显示视图时,显示redirect中设置的值“LATITUDE2”。 不应该显示“LATITUDE”吗?

你的问题是(一步一步)

  1. 您的SomeInformation()方法将test1.Latitude的值test1.Latitude为“LATITUDE2”。
  2. 然后,使用接受对象的RedirectToAction的重载将该模型传递给您的Index()方法。 在内部,它使用reflection来build立一个基于你的模型属性的RouteValueDictionary (在这种情况下,它的简单latidute="LATITUDE2" )。
  3. 当你点击Index方法时,模型被DefaultModelBinder绑定,现在DataSiteList.Latitude的值是“LATITUDE2”(这就是你inputif块的原因)
  4. 在绑定过程中, DefaultModelBinderLatitudeModelState值设置为“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); }