gpt4 book ai didi

asp.net-mvc-3 - ASP.NET MVC 需要正数作为输入,在模型中保存为负数 - 验证失败

转载 作者:行者123 更新时间:2023-12-02 05:36:27 24 4
gpt4 key购买 nike

我想为具有“Sum”(小数)字段的“Expense”对象建模。在 View 中,我想验证用户是否输入了一个正数 值。

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 形式的值),看到负值并且验证失败。

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

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

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

最佳答案

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

想不出更直接的东西。

这是模型现在的样子:

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); }
}
}

关于asp.net-mvc-3 - ASP.NET MVC 需要正数作为输入,在模型中保存为负数 - 验证失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11622044/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com