TextBox用于显示初始值,而不是从代码更新的值

本文关键字:代码 更新 显示 用于 TextBox | 更新日期: 2023-09-27 18:28:23

我有一个显示值的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"。难道不应该显示"纬度"吗?

TextBox用于显示初始值,而不是从代码更新的值

您的问题是(逐步)

  1. 您的SomeInformation()方法设置test1.Latitude的值至"纬度2"
  2. 然后使用重载将该模型传递给Index()方法接受对象的CCD_ 7。内部使用基于属性构建RouteValueDictionary的反思您的模型(在本例中仅为latitude="LATITUDE2"
  3. 当您使用Index方法时,模型由DefaultModelBinder绑定,现在DataSiteList.Latitude的值为"LATITUDE2"(这就是您输入if块)
  4. 在绑定过程中,DefaultModelBinder设置LatitudeModelState值设置为"纬度2"。任何设置尝试Latitude的值现在被忽略,因为视图使用ModelState值来呈现控件

不清楚你想在这里做什么。通过将ModelState.Clear();添加为Index()方法的第一行,可以使其按预期工作。这将清除所有现有的ModelState值,您现在可以将该值设置为"纬度"。

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

编辑

提供更多信息,说明为什么一旦设置了ModelState,更新模型特性就没有影响。

假设您有一个表单来收集用户信息,其中模型包含int Age。用户被要求输入自己的年龄,然后有人输入"我下周五岁了!"。当然,这不会绑定到int,所以DefaultModelBinder添加值(attemptedValue)并添加ModelStateError

返回视图时,通常会显示一条错误消息,如"字段年龄必须是一个数字"。如果呈现控件的html助手使用了模型值,那么它将显示"0"(int的默认值)。如果用户在文本框中看到"0",然后是一条消息,说它必须是一个数字,这会让用户感到有些困惑(什么!但零是一个号码,我输入的内容到底发生了什么?)。因此,助手使用ModelState中的值,现在用户会看到"我下周五岁了!"以及一条对该值有意义的相关错误消息。

因此,即使你认为"不符合逻辑",这种行为实际上也有一些逻辑。

您没有设置海拔高度。它将为空,因此代码永远不会进入此块并将Latitude设置为"Lattitude"

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