TextBoxFor显示初始值,而不是从代码更新的值

时间:2014-10-30 13:52:55

标签: c# asp.net-mvc

我有一个显示值的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”吗?

2 个答案:

答案 0 :(得分:95)

你的问题是(一步一步)

  1. 您的SomeInformation()方法设置test1.Latitude的值 “LATITUDE2”。
  2. 然后使用重载将该模型传递给Index()方法 接受对象的RedirectToAction在内部使用 反射以基于属性构建RouteValueDictionary 您的模型(在这种情况下只是latitude="LATITUDE2")。
  3. 当您点击Index方法时,模型受DefaultModelBinder约束,现在DataSiteList.Latitude的值为“LATITUDE2”(这就是您输入的原因) if区块)
  4. 在绑定过程中,DefaultModelBinder设置了。{ ModelState的{​​{1}}值为“LATITUDE2”。任何尝试设置 现在忽略Latitude的值,因为视图使用了 Latitude值来呈现控件。
  5. 不清楚你在这里尝试做什么。您可以通过添加ModelState作为ModelState.Clear();方法的第一行,使其按预期工作。这将清除所有现有Index()值,您现在可以将值设置为“LATITUDE”。

    但是你的ModelState阻止是没有意义的。也许您只是在进行某种测试,但您也可以从if方法中删除参数,并在方法中初始化Index()的新实例。

    修改

    在设置DataSites后,提供更多信息,说明更新模型属性的原因无效。

    想象一下,您有一个表单来收集模型包含ModelState的用户信息。要求用户输入他们的年龄,有人输入“我下周五点!”。当然,这不会绑定到int,因此int Age会添加值(DefaultModelBinder)并添加attemptedValue

    当返回视图时,它通常会显示错误消息,例如“字段年龄必须是数字”。如果呈现控件的html帮助器使用了模型值,那么它将显示“0”(int的默认值)。用户在文本框中看到“0”会有点混乱,接下来会有一条消息说它必须是一个数字(什么!但零是一个数字,我输入的是什么?)。因此,助手使用ModelStateError中的值,现在用户看到“我下周五点!”以及对该值有意义的相关错误消息。

    所以即使你认为“它不合逻辑”,这个行为实际上也有一些逻辑。

答案 1 :(得分:-5)

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

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

        return View(test);
    }