19

型号

class Address
{
    public string City { get; set; }
    public string Zip { get; set; }
}

控制器

[HttpPost]
public ActionResult GetAddress(Address model)
{
    if (!String.IsNullOrEmpty(model.Zip))
    {
        model.City = GetCityByZip(model.Zip);
    }
    return View(model);
}

观点

<div class="formrow">
    @Html.LabelFor(model => model.City)
    @Html.TextBoxFor(model => model.City) 
    @Html.ValidationMessageFor(model => model.City)
</div>
<div class="formrow">
    @Html.LabelFor(model => model.Zip)
    @Html.TextBoxFor(model => model.Zip) 
    @Html.ValidationMessageFor(model => model.Zip)
</div>

问题是每当城市被修改时,它永远不会反映在视图上。在调试期间,model.City包含正确的值,但未显示在视图中。即使是简单的事情@Html.TextBoxFor(model => model.City)也不会显示正确的model.City值。

4

2 回答 2

48

当您更新和返回模型时,HtmlHelpers 从模型状态而不是模型中获取模型值。为了更新和返回模型,在你的 post 方法中添加这行代码:

ModelState.Clear();

或者您可以在 ModelState 本身中设置 city 的值:

ModelState["City"].Value = GetCityByZip(model.Zip);
于 2012-08-07T02:37:16.230 回答
3

正如 Tommy 所指出的,这有点违反直觉,这是正确的行为,因为在将数据绑定到返回的视图时,在 post 上提交的表单数据具有第一优先级。这是有道理的,因为用户在重新返回相同的视图时可能会出现验证错误,并可以按原样恢复他们的表单输入,而不会在恢复页面时丢失表单输入的问题

另一种选择是手动插入输入值

所以代替这个

@Html.TextBoxFor(model => model.City)

改为这样做

<input type="text" name="City" value="@Model.City" />

*这将直接从模型中获取值

甚至更好

<input type="text" value="@Model.City"
       name="@Html.NameFor(model => model.City)"
       id="@Html.IdFor(model => model.City)" />

*注意:这不会带来data-val属性。如果您在此属性上使用它们进行客户端验证,则需要为给定元素构建数据验证属性列表

其他资源

于 2020-05-19T15:00:47.223 回答