为什么ASP.NET MVC 3没有正确验证我的浮动?

时间:2011-01-13 13:39:35

标签: asp.net asp.net-mvc asp.net-mvc-3

我有一个允许输入的视图,我的SQL Server 2008 R2数据库中的字段设置为float,我正在使用Entity Framwork 4。

在实体框架模型中,该字段看起来像private Nullable<global::System.Double> _TestNumber;

View使用EditorField来允许这样的输入:

<div class="editor-field">
    @Html.EditorFor(model => model.TestNumber)
    @Html.ValidationMessageFor(model => model.TestNumber)
</div>

然而,我在验证消息中收到此错误:The value '13.51' is not valid for TestNumber.我尝试使用逗号代替句点,同样的事情。

建议?

1 个答案:

答案 0 :(得分:2)

这应该有效:

查看型号:

public class MyViewModel
{
    public double? TestNumber { get; set; }
}

控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel { TestNumber = 13.51 });
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

查看:

@model AppName.Models.MyViewModel
@{
    ViewBag.Title = "Home Page";
}
@using (Html.BeginForm())
{
    @Html.EditorFor(x => x.TestNumber)
    @Html.ValidationMessageFor(x => x.TestNumber)
    <input type="submit" value="OK" />
}

您可以签出并且可以解释您观察到的行为的一件事是客户端文化和服务器端文化之间的不一致。因此,例如,如果您已启用客户端验证但客户端文化使用,作为小数分隔符,则13.51将无法通过客户端验证,并且如果服务器区域使用.作为小数分隔符然后13,51将失败服务器端验证。因此,13.5113,51都无法验证,但在不同的图层上。为了使服务器使用与客户端相同的文化,您可以在web.config中将文化设置为auto

<globalization 
    requestEncoding="utf-8" 
    responseEncoding="utf-8" 
    culture="auto" 
    uiCulture="auto"
/>