TextBox用于显示初始值,而不是从代码更新的值[重复]
Posted
技术标签:
【中文标题】TextBox用于显示初始值,而不是从代码更新的值[重复]【英文标题】:TextBoxFor displaying initial value, not the value updated from code [duplicate] 【发布时间】:2014-10-30 13:52:55 【问题描述】:我有一个显示值的 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”。然后重定向到控制器中的Index()
操作,将属性设置为“纬度”并返回视图。
当它显示视图时,它会显示重定向中设置的值“LATITUDE2”。不应该显示“纬度”吗?
【问题讨论】:
安装 fiddler 并观察当您致电RedirectToAction
时实际发生的情况 - 您的答案就在那里。
DataSiteList.Altitude != null
是拼写错误还是altitude
属性实际上存在于您的模型DataSites
中?
试试这个,把return RedirectToAction("Index", test1);
换成return Index(text1);
。
@AdrienTancrez 也许你应该开始,它是一个非常宝贵的 Web 开发调试工具。
@TiagoSilva 这不是一个很好的解决方案,因为网址不会改变。
【参考方案1】:
你的问题是(一步一步)
-
您的
SomeInformation()
方法设置test1.Latitude
的值
到“LATITUDE2”。
然后使用重载将该模型传递给 Index()
方法
RedirectToAction
接受一个对象。这在内部使用
反射以基于属性构建RouteValueDictionary
您的模型(在这种情况下,它只是 latitude="LATITUDE2"
)。
当您点击Index
方法时,模型被DefaultModelBinder
绑定,现在DataSiteList.Latitude
的值是“LATITUDE2”(这就是您输入的原因
if
块)
在绑定过程中,DefaultModelBinder
设置了
ModelState
Latitude
的值到“LATITUDE2”。任何尝试设置
Latitude
的值现在被忽略,因为视图使用
ModelState
值来呈现控件。
不清楚你想在这里做什么。您可以通过将ModelState.Clear();
添加为Index()
方法的第一行来使其按预期工作。这会清除所有现有的 ModelState
值,您现在可以将值设置为“纬度”。
但是你的if
块没有意义。也许您只是在做某种测试,但您也可以从 Index()
方法中删除参数,并在方法中初始化 DataSites
的新实例。
编辑
提供更多信息,说明为什么在设置 ModelState
后更新模型属性没有影响。
假设您有一个表单来收集用户信息,其中模型包含int Age
。要求用户输入他们的年龄,有人输入“我下周五岁!”。当然,这不会绑定到 int,所以 DefaultModelBinder
添加值(attemptedValue
)并添加 ModelStateError
。
返回视图时,它通常会显示一条错误消息,例如“字段年龄必须是数字”。如果渲染控件的 html 助手使用模型值,那么它将显示“0”(int 的默认值)。用户在文本框中看到“0”会有些混乱,接下来会显示一条消息说它必须是一个数字(什么!但零是一个数字,我输入的内容到底发生了什么? em>)。因此,助手使用来自ModelState
的值,现在用户看到“我下周五岁了!”以及对值有意义的相关错误消息。
因此,即使您认为“这不合逻辑”,这种行为实际上也有一定的逻辑性。
【讨论】:
【参考方案2】:您没有设置高度。它将为空,因此代码永远不会进入此块并将 Lattitude 设置为“LATTITUDE”
if (DataSiteList.Altitude != null)
DataSites test = new DataSites();
test.Latitude = "LATITUDE";
return View(test);
【讨论】:
Altitude
的值 正在 被设置(在 SomeInformation
方法中)。如果if
块没有被击中,那么视图将显示一个空字符串,而不是 OP 所说的“LATITUDE2”。
我的答案是在 OP 修复该部分代码之前提交的。在修复之前,代码是设置纬度和检查高度。现在,代码设置纬度检查纬度...而不是高度,就像您在评论中所说的那样。
海拔或纬度没有区别。这与OP的问题完全无关。
@StephenMuecke 其实我不同意。如果他正在设置一个属性 (Latitude
),然后在它仍然为空时检查另一个不为空 (Altitude
),它永远不会尝试重新实例化 DataSites
并填充该新属性 (Latitude
) 任何东西,因为被检查的属性 (Altitude
) 仍然为空,因此不符合 if
条件。以上是关于TextBox用于显示初始值,而不是从代码更新的值[重复]的主要内容,如果未能解决你的问题,请参考以下文章
vba窗体中如何获取列表框listbox1选中行的值返回到文本框textbox1。
C#怎么把子窗体中的comboBox1的值能够传到父窗体的toolStrip组件中的textbox中去么?能的话代码怎么写