我有一个显示值的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”并返回视图。
DataSites
Latitude
Index()
当显示视图时,它将显示在重定向中设置的值“ LATITUDE2”。不应该显示“纬度”吗?
您的问题是(逐步)
SomeInformation()
test1.Latitude
RedirectToAction
RouteValueDictionary
latitude="LATITUDE2"
Index
DefaultModelBinder
DataSiteList.Latitude
if
ModelState
目前尚不清楚您要在这里做什么。您可以通过添加ModelState.Clear();作为方法的第一行来使其按预期工作Index()。这将清除所有现有ModelState值,您现在可以将其设置为“ LATITUDE”。
ModelState.Clear();
但是你的if障碍没有意义。也许您只是在做某种测试,但是您也可以从Index()方法中删除参数,并在方法中初始化一个新实例DataSites。
编辑
为了给出更多有关为什么设置模型属性后更新无效的信息ModelState。
假设您有一个表格来收集模型所包含的用户信息int Age。要求用户输入他们的年龄,然后有人输入“下周我五岁!”。当然,这不会绑定到int,因此DefaultModelBinder会添加值(attemptedValue)并添加ModelStateError。
int Age
attemptedValue
ModelStateError
返回视图后,通常会显示一条错误消息,例如“字段年龄必须是数字”。如果呈现控件的html helper使用了模型值,则它将显示“ 0”(int的默认值)。对于用户来说,在文本框中看到“ 0”会有些令人困惑,然后显示一条消息,提示它必须是一个数字( 什么!但是零是一个数字,我输入的内容到底发生了什么? )。因此,帮助程序使用的是的值ModelState,现在用户看到“下周我五岁!” 以及对值有意义的关联错误消息。
因此,即使您以为 “它不合逻辑” ,实际上这种行为还是有逻辑的。