【问题标题】:Validate data for Ajax POST request验证 Ajax POST 请求的数据
【发布时间】:2012-02-15 06:36:24
【问题描述】:

我有一个订单输入页面和一个对应的 ViewModel(简化示例):

public class OrderCreateViewModel
{
    [Required]
    [StringLength(100)]
    public string Remark { get; set; }

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

此模型用于创建视图:

@model MyNamespace.OrderCreateViewModel

@using (Html.BeginForm())
{
    @Html.ValidationSummary(false)
    @Html.EditorFor(model => model.Remark)
    @Html.EditorFor(model => model.AddressCity)
    <input type="submit" value="Create order" name="saveButton" />
}

控制器中 POST 请求的 Create 动作是:

[HttpPost]
public ActionResult Create(OrderCreateViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        // Save order in DB
        return RedirectToAction("Index");              
    }
    return View(viewModel);
}

顺序(必填字段和字符串长度)在客户端(使用不显眼的 Javascript、jQuery 验证)和服务器端 (ModelState.IsValid) 进行验证。

现在,我在页面上添加了第二个按钮,目的是将Address(在示例中为AddressCity)保存在主表中。这应该发生在 Ajax POST 请求中(使用 jQuery):

<input id="buttonAddAddress" type="button" value="Add address" />

单击事件处理程序与此按钮挂钩,该按钮读取与地址相关的输入字段的内容(示例中仅AddressCity)并向服务器发送 POST 请求:

$("#buttonAddAddress").click(function () {
    var address = JSON.stringify({
        City: $('#AddressCity').val()
    });

    $.ajax({
        type: 'POST',
        url: '@Url.Action("AddAddress")',
        data: address,
        dataType: 'json',
        contentType: 'application/json; charset=utf-8',
        ...
    });
});

控制器对此请求有相应的 POST 动作:

[HttpPost]
public ActionResult AddAddress(Address address)
{
    // Create address in database
    return Json(true);
}

Address 是辅助类型:

public class Address
{
    public string City { get; set; }
    // ...
}

此代码无法验证 AddressCity 是否是必需的,并且不能超过 50 个字符。

问题:如何向此 Ajax POST 请求添加验证 - 客户端和服务器端验证?我不知道如何在客户端执行此操作。在服务器端,我想避免明显的琐碎解决方案来重复验证属性的含义(如if (!string.IsNullOrEmpty(address.City) &amp;&amp; address.City.Length &lt;= 50) ... 等)并在可能的情况下利用现有的验证属性。

【问题讨论】:

  • 我有一个类似的问题,我必须通过 ajax 调用处理验证错误,我关注了erraticdev.blogspot.com/2010/11/…,但这与返回部分视图与 json 结果更相关。

标签: jquery asp.net-mvc asp.net-mvc-3 validation jquery-validate


【解决方案1】:

对于服务器:

public class Address
{
    [Required]
    [StringLength(50)]
    public string City { get; set; }
}

对于客户端,由于您使用的是 AddressCity 字段,它已经具有与从主视图模型应用的相同的验证规则。

但既然我猜你会告诉我这不是 DRY,好吧,OOP 来救援:

public class AddressViewModel
{
    [Required]
    [StringLength(50)]
    public string City { get; set; }
}

和你的主视图模型:

public class OrderCreateViewModel: AddressViewModel
{
    [Required]
    [StringLength(100)]
    public string Remark { get; set; }
}

以及您各自的控制器操作:

[HttpPost]
public ActionResult Create(OrderCreateViewModel viewModel)
{
    ...
}

[HttpPost]
public ActionResult AddAddress(AddressViewModel address)
{
    ...
}

【讨论】:

  • @Slauma,是的,然后就是 if (ModelState.IsValid)。
  • 这看起来很简单!如果AddressViewModel 是OrderCreateViewModel 的成员而不是继承,它也会起作用吗?
  • 服务器端验证适用于您的方法,但客户端验证不适用。可能原因是input 元素有type="button",而不是type="submit"。 (我不知道 jquery 验证究竟是如何工作的,可能只有一个事件处理程序与“提交”类型的输入元素挂钩。)但是如果我们将类型更改为“提交”,我们会收到一个对 Create 操作的发布请求不想要。不幸的是,我们现在没有时间解决这个问题。我接受你的回答(无论如何服务器端是更重要的部分),也许我们有时间时会创建一个后续问题。
猜你喜欢
  • 1970-01-01
  • 2015-10-23
  • 2018-03-23
  • 1970-01-01
  • 2014-02-22
  • 2011-05-22
  • 2020-08-20
  • 2016-11-27
  • 1970-01-01
相关资源
最近更新 更多