预填充模型时的ASP.NET MVC验证问题

时间:2011-07-05 04:35:42

标签: asp.net-mvc validation

我在包含模型验证消息的页面上遇到问题。

页面有一个搜索表单,模型是一个表示表单中项目的对象。当用户访问该页面时,邮政编码将自动填入控制器,然后将模型传递到视图中。

这会导致邮政编码字段的验证邮件显示,即使邮政编码格式正确。

以下是控制器中的代码:

public ActionResult WhereToBuyIndex(LocatorSearch searchOptions)
{
    if (searchOptions == null)
    {
        searchOptions = new LocatorSearch();
    }

    //ATTEMPT TO GET USER ZIP CODE
    AppLib.Geolocation.Web.WebGeolocationService geoService = new AppLib.Geolocation.Web.WebGeolocationService();
    searchOptions.Address = geoService.GeolocateToZipCode(Request.ServerVariables["REMOTE_ADDR"]);
    if (searchOptions.Address == "00000") { searchOptions.Address = "90210"; }

    ViewBag.Countries = LocatorService.Instance.LoadCountriesWithCustomers();

    return View("Index", searchOptions);
}

并且视图中涉及zip字段的唯一行如下:

@Html.TextBoxFor(model => model.Address, new { id = "fAddress" })
<span class="failure">@Html.ValidationMessageFor(model => model.Address)</span> 

如果我尝试预填充任何其他字段,我会得到相同的验证问题 - 显示所有预填充的字段错误消息

非常感谢任何帮助,

谢谢。

1 个答案:

答案 0 :(得分:2)

当您使用此方法签名时,LocatorSearch的默认绑定器会在调用函数中的任何代码之前执行验证:

public ActionResult WhereToBuyIndex(LocatorSearch searchOptions)

有几种方法可以解决错误,一种方法是在此函数上使用[HttpPost]属性,并使用一个没有参数的方法,以便在用户尚未提交搜索时填充默认值。

或者,您可以使用ModelState["Address"].Errors.Clear();清除错误。这是一个更丑陋的解决方案。