【问题标题】:C# mvc2 client side form validation with xval, prevent postC# mvc2 客户端表单验证与 xval,防止发布
【发布时间】:2011-02-08 19:22:44
【问题描述】:

我正在使用 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>

【问题讨论】:

  • 为什么您的 ValidationMessage("product.FromPriceInCents") 但您的文本框使用的是“FromPriceInCents”?这似乎很可疑。你有什么理由不使用强类型的助手? ValidationMessageFor(x=>x.FromPriceInCents)
  • 我将文本框和验证消息更改为强类型助手。但是这个变化不会影响验证,但是很好的提示!

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


【解决方案1】:

【讨论】:

  • 这是我在正确方向上需要的推动力! jquery validate 函数起到了作用。表单是用 jquery 加载的,提交验证后没有正确处理
【解决方案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

【讨论】:

  • 感谢您的良好回复,我会尝试您的解决方案并通知您。您对服务器端验证是正确的,我确实仍然需要解决这个问题。
  • 我通过在文本框中添加前缀来尝试您的解决方案。但随后验证根本不起作用。当我这样使用它时; ("product") %> 验证显示错误当我在期望数字的框中输入文本时。但是当我尝试提交页面时,它仍在进行回发,这是我不希望并希望它做的事情。现在使用 Modelstate.IsValid 进行服务器端验证
  • 啊,是的,那是因为 Create 方法无法从表单值中提取值。我用示例更新了帖子
  • @Artion 感谢您的快速回复,我尝试了您的建议,但它不起作用:(我发现使用按钮提交表单的位置,所以我用它更新了问题。这可能与问题有关吗?
  • 用更正确的示例 + 示例项目下载更新了帖子.. 绝对有效:)
【解决方案3】:

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

【讨论】:

  • 范围属性是一个测试。但我会试着把它放回去看看会发生什么。
  • 好的,我试过了,客户端验证给出了这个错误;请输入一个介于 1 和 2147483647 之间的值。但在 firebug 中我可以看到该页面仍在尝试回发,但它返回以下错误; '对象引用未设置为对象的实例。'
  • 尝试让您的 Create 操作采用像这样的对象类型 public ActionResult Create(ObjectType newObject)
  • 控制器已经采用了以下参数 public override ActionResult Create(Guid pageId, Guid pluginInstanceId, Product entity, FormCollection collection)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 2012-09-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多