显示初始值的TextBox,而非代码更新后的值

50

我有一个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()操作,将该属性设置为"LATITUDE"并返回视图。
当它显示视图时,会显示在重定向中设置的值"LATITUDE2"。难道不应该显示"LATITUDE"吗?

1
DataSiteList.Altitude != null 这是拼写错误还是 DataSites 模型中实际存在 altitude 属性? - Aymeric
一份“逻辑”解释是因为我给了正确的对象来看待...我不理解。 - Adrien Tancrez
1
尝试一下,将 return RedirectToAction("Index", test1); 替换为 return Index(text1); - user4196352
1
@AdrienTancrez 也许你应该开始使用它,这是 Web 开发中无价的调试工具。 - asawyer
1
@TiagoSilva 这并不是一个好的解决方案,因为 URL 不会改变。 - asawyer
显示剩余9条评论
2个回答

100

您的问题是(逐步)

  1. 您的SomeInformation()方法将test1.Latitude的值设置为"LATITUDE2"。
  2. 然后,您使用接受对象的RedirectToAction重载将该模型传递给Index()方法。在内部,这使用反射基于模型的属性构建RouteValueDictionary(在这种情况下,它只是latitude="LATITUDE2")。
  3. 当您访问Index方法时,模型由DefaultModelBinder绑定,现在DataSiteList.Latitude的值为"LATITUDE2"(这就是为什么您进入if块的原因)
  4. 在绑定过程中,DefaultModelBinderLatitudeModelState值设置为"LATITUDE2"。现在,任何设置Latitude值的尝试都将被忽略,因为视图使用ModelState值来呈现控件。

不清楚你在这里想做什么。你可以通过在你的Index()方法的第一行添加ModelState.Clear();来使它按照你的期望工作。这将清除所有现有的ModelState值,然后你就可以将值设置为“LATITUDE”。

但是你的if块没有意义。也许你只是在做某种测试,但你可以从Index()方法中删除参数,并在该方法中初始化一个新的DataSites实例。

编辑

为了更详细地说明为什么更新模型属性在设置ModelState后没有影响。

想象一下,你有一个收集用户信息的表单,其中模型包含int Age。用户被要求输入他们的年龄,有人输入“我下周五岁了!”。当然,这不会绑定到一个整数,所以DefaultModelBinder添加了该值(attemptedValue)并添加了一个ModelStateError

当视图被返回时,通常会显示一个错误消息,例如“年龄字段必须是数字”。如果渲染控件的 HTML 帮助程序使用了模型值,则会显示“0”(int 的默认值)。对于用户来说,在文本框中看到“0”,然后再看到一条消息说它必须是数字,可能会有些困惑(什么!但零是一个数字,我输入的东西怎么回事?)。因此,帮助程序使用 ModelState 中的值,现在用户可以看到“我下周五岁!”和一个与该值相关的有意义的错误消息。

因此,即使您认为“这不合逻辑”,实际上这种行为是有一定逻辑的。


-5

您没有设置高度。因此,代码将永远不会进入此块并将纬度设置为“LATTITUDE”。

    if (DataSiteList.Altitude != null)
    {
        DataSites test = new DataSites();
        test.Latitude = "LATITUDE";

        return View(test);
    }

Altitude的值正在被设置(在SomeInformation方法中)。如果if块没有被执行,那么视图将显示一个空字符串,而不是OP所说的“LATITUDE2”。 - user3559349
1
我的回答是在问题的提出者修复代码之前提交的。在修复之前,该代码设置了纬度和检查高度。现在,该代码设置纬度并检查纬度...而不是像你评论中所说的那样检查高度。 - Keith
2
高度或纬度都没有关系。这与OP的问题完全无关。 - user3559349
1
@StephenMuecke 实际上我不同意。如果他只设置了一个属性(Latitude),然后在另一个属性(Altitude)仍为空时检查它是否为空,那么它永远不会尝试重新实例化 DataSites 并填充该新属性(Latitude)的任何内容,因为被检查的属性(Altitude)仍将为空,因此不符合该 if 条件。 - vapcguy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接