使用xval进行C#mvc2客户端表单验证,防止发布

时间:2010-04-16 11:55:08

标签: c# javascript asp.net-mvc validation xval

我正在使用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日 我刚刚发现有一个正常的按钮而不是输入类型=“按钮”这可能是问题吗?

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

3 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

我的第一个主要关注点是:为什么你的应用程序首先在数据库中保存值?虽然xVal是使应用程序用户友好的好方法,但您仍然需要进行服务器端验证。如果您没有在服务器上验证您的数据 - 您有一个安全漏洞!在保存值之前,请尝试检查控制器中的ModelState.IsValid。

现在,从我看到你使用

注册xVal验证
<%= Html.ClientSideValidation<Product>("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

答案 2 :(得分:0)

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