5

我正在使用xval在我的 asp.net mvc2 web 应用程序中使用客户端验证。尽管我在数字字段中输入文本时出现错误,但它仍会尝试将表单发布到数据库。不正确的值被 0 替换并保存到数据库中。但相反,它甚至不应该尝试提交表单。有谁可以帮我离开这里吗?

我已将属性设置如下:

[Property]
[ShowColumnInCrud(true, label = "FromPriceInCents")]
[Required]
//[Range(1, Int32.MaxValue)]
public virtual Int32 FromPriceInCents{ get; set; }

捕获请求的控制器如下所示;我在这部分没有错误。

[AcceptVerbs(HttpVerbs.Post)]
[Transaction]
[ValidateInput(false)]
public override ActionResult Create()
{
  //some foo happens
}

我的视图如下所示:

<div class="label"><label for="Price">FromPrice</label></div>
<div class="field">
<%= Html.TextBox("FromPriceInCents")%>
<%= Html.ValidationMessage("product.FromPriceInCents")%></div>

在视图的末尾,我有以下规则,它在 html 代码中生成正确的验证规则

<%= Html.ClientSideValidation<Product>("Product") %>

我希望有人可以帮助我解决这个问题,在此先感谢!

编辑:4 月 19 日我刚刚发现有一个普通按钮正在使用而不是输入 type="Button" 这可能是问题吗?

<button class="save" type="submit" name="save"><span>Opslaan</span></button>
4

3 回答 3

3

也许这会有所帮助:

如何将 jQuery Validation 插件与元数据、jQuery Forms 和 xVal 一起使用?

于 2010-04-22T09:31:25.313 回答
2

我首先关心的问题是:为什么您的应用程序首先将值保存在数据库中?虽然 xVal 是使应用程序用户友好的好方法,但您仍然必须进行服务器端验证。如果你不在服务器上验证你的数据——你就有一个巨大的安全漏洞!在保存值之前尝试检查控制器中的 ModelState.IsValid 是否存在。

现在,据我所知,您正在使用注册 xVal 验证

<%= Html.ClientSideValidation<Product>("Product") %>

它的工作方式是为所有以“产品”为前缀的控件启用客户端验证。另一方面,您的文本框的 id 为FromPriceInCents

所以这里的解决方案是这样做:

<%= Html.TextBox("FromPriceInCents")%>
<%= Html.ValidationMessage("FromPriceInCents")%>

<%= Html.ClientSideValidation<Product>() %>

UPD3 我更新了帖子。修复了代码,以便不使用前缀。

此外,我编译了一个包含工作解决方案的工作解决方案。列出、编辑、创建页面、字符串和 int 属性以及 xVal 验证。

public class Product
{
    [ScaffoldColumn(false)]
    public int Id { get; set; }

    [Required]
    [Range(1,50)]
    public int PriceInCents { get; set; }

    [Required]
    [StringLength(50)]
    public string Name { get; set; }
}

并且在视图中

<%= Html.TextBoxFor(model => model.PriceInCents) %>
<%= Html.ValidationMessageFor(model => model.PriceInCents) %>

这是下载链接。检查一下并告诉我它是否有效 http://www.flexlabs.org/download/xValTest

于 2010-04-18T08:03:59.413 回答
0

为什么将 Range 属性注释掉?使用您指定的属性,只要在文本框中输入任何内容,它就应该通过客户端验证。

于 2010-04-16T14:27:50.697 回答