2

我想对具有“总和”(十进制)字段的“费用”对象进行建模。在视图中,我想验证用户输入了一个正值

OTOH 我想确保在数据库中保存具有负值的对象。

现在,模型看起来像这样:

//------The model-------
public class Operation {
    [Range(typeof(decimal), "0.0001", "79228162514264337593543950335")]
    public virtual decimal Sum { get; set; }
    [...]
}
public class Expense : Operation
{
    public override decimal Sum
    {
        get
        {
            return base.Sum;
        }
        set
        {
            base.Sum = - Math.Abs(value);
        }
    }
}

//------In the controller-------
[HttpPost]
public ActionResult CreateExpense(Expense operation, int[] SelectedTags)
{
    return CreatePost(operation, SelectedTags);
}
private ActionResult CreatePost(Operation operation, int[] SelectedTags)
{
    if (ModelState.IsValid)  //  <-- this fails
    [...]
}

问题是,MVC 验证适用于对象的属性(不是 POST 的表单值),看到负值并且无法验证。

我应该怎么做才能解决这个问题?

在我看来,我没有分离关注点(验证用户输入与维护数据库完整性)。

我应该使用视图模型来保存用户输入,然后从视图模型中填充实际模型吗?听起来不像KISS...

4

2 回答 2

5

我发现在继承类的属性上指定一个单独的验证属性是一种享受。

想不出更直接的东西了。

这是模型现在的样子:

public class Operation {
    public virtual decimal Sum { get; set; }
}
public class Income : Operation
{
    [Range(typeof(decimal), "0.0001", "79228162514264337593543950335")]
    public override decimal Sum
    {
        get { return base.Sum; }
        set { base.Sum = Math.Abs(value); }
    }
}

public class Expense : Operation
{
    [Range(typeof(decimal), "-79228162514264337593543950335", "-0.0001")]
    public override decimal Sum
    {
        get { return base.Sum; }
        set { base.Sum = - Math.Abs(value); }
    }
}
于 2012-07-24T00:14:09.387 回答
0

检查值是否小于零的验证属性是另一个简单的解决方案。

public class PositiveNumberAttribute : ValidationAttribute
{
    protected override ValidationResult IsValid(object number, ValidationContext validationContext)
    {
        return int.Parse(number.ToString()) >= 0
            ? ValidationResult.Success : new ValidationResult("Positive value required.");
    }
}

然后申请房产

[PositiveNumber]
public virtual decimal Sum { get; set; }
于 2021-11-22T03:35:40.170 回答