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设置了 ModelStateLatitude 的值到“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根据选项按钮选择更新文本框值

vba窗体中如何获取列表框listbox1选中行的值返回到文本框textbox1。

C#怎么把子窗体中的comboBox1的值能够传到父窗体的toolStrip组件中的textbox中去么?能的话代码怎么写

从 MYSQL 表中更新值而不重新加载页面?

Python3 Flask 路由变量显示为变量名而不是从邮递员传递的值

提交文本框的值而不重新加载页面