在ASP.NET MVC(3)中使用数据注释验证时,是否可以为属性生成计算值?

时间:2011-05-01 19:29:06

标签: c# asp.net-mvc validation asp.net-mvc-3 data-annotations

正如标题所说,在ASP.NET MVC(3)中使用数据注释验证时,是否可以为属性生成计算值?

考虑信用卡示例。信用卡必须有一个到期日,通常是月和年。在用户界面中,通常最好有select个字段供用户选择而不是text字段。然而,另一方面,当将数据发送到支付网关时,它通常是多种格式的一个字符串:M/Y; MM/YY; MM/YYYY;等

所以我想要完成的是在我验证了两个单独的日期后生成最后一个字符串。

无论如何,如果有人能指出我正确的方向,那就太棒了。我只使用了内置属性,所以当我想要这样的东西时,我想把我视为一个nubski。

2 个答案:

答案 0 :(得分:2)

假设您有月份和年份属性:

[Range(1, 12)]
public int Month { get; set; }
[Range(2011, 2100)]
public int Year { get; set; }

您的视图模型上可能有第三个属性,表示所需的值:

public string ExpirationDate
{
    get 
    {
        return new DateTime(Year, Month, 1).ToString("MM/yyyy");
    }
}

因此,一旦您的视图模型成功通过验证,您就可以将ExpirationDate属性发送到支付网关:

[HttpPost]
public ActionResult Pay(PayViewModel model)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }
    PaymentGateway.Pay(model.CCNumber, model.ExpirationDate);
    return RedirectToAction("Success");
}

答案 1 :(得分:1)

添加一个不在GUI中显示的属性,并连接您的值:

    class CreditCard
{
    public string ExpirationYear { get; set; }
    public string ExpirationMonth { get; set; }

    public string ExpirationDate
    {
        get
        {
            return string.Format("{0}/{1}", ExpirationMonth, ExpirationYear);
        }
    }
}

或者您可以使用提供格式

的方法