我有一个显示值的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”吗?
答案 0 :(得分:95)
你的问题是(一步一步)
SomeInformation()
方法设置test1.Latitude
的值
“LATITUDE2”。Index()
方法
接受对象的RedirectToAction
在内部使用
反射以基于属性构建RouteValueDictionary
您的模型(在这种情况下只是latitude="LATITUDE2"
)。Index
方法时,模型受DefaultModelBinder
约束,现在DataSiteList.Latitude
的值为“LATITUDE2”(这就是您输入的原因)
if
区块)DefaultModelBinder
设置了。{
ModelState
的{{1}}值为“LATITUDE2”。任何尝试设置
现在忽略Latitude
的值,因为视图使用了
Latitude
值来呈现控件。不清楚你在这里尝试做什么。您可以通过添加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);
}