模型验证 - 检查过帐的值是否小于原始值

时间:2012-04-04 14:55:22

标签: c# asp.net-mvc-3

我有一个ViewModel,其中包含一个表单:

@using(Html.BeginForm())
{
     @Html.EditorFor(x=>x.Price)
     <input type="submit" value="Submit" />
}

在我加载此View的Controller Action中,我设置了Price并将其传递给View。例如,我将其设置为3:

public ActionResult MyAction()
{
     MyModel model = new MyModel();
     model.Price = 3;
     return View(model);
}

我想要做的是,当提交此表单时,我想检查用户提交的值是否小于原始值,在这种情况下3.模型验证是否可以实现?因此,如果我输入2,那么ModelState将无效,但如果我输入4,则它将是有效的。

4 个答案:

答案 0 :(得分:0)

我认为

RemoteAttribute适合这个:

在价格字段之上:

[RemoteAttribute("CheckPrice", "MyController", AdditionalFields="MyModelId")]
控制器MyController中的

public ActionResult CheckPrice(decimal price, int myModelId){
   //get model by id
   //return valid or invalid
   return Json(true, JsonRequestBehavior.AllowGet);
}

*编辑服务器端:

创建一个继承RemoteAttribute&amp;在IsValid方法中使用相同的逻辑:

public class MyRemoteAttribute : RemoteAttribute
{
     public MyRemoteAttribute() : base("CheckPrice","Kenmerk"){
         base.HttpMethod = "Post";
     }

     public override bool IsValid(object value){
           //recreate validation here
           //additionalfields can be found in HttpContext.Current.Request.Params
           return true;
     }
}

答案 1 :(得分:0)

为什么每次都要向服务器发布一个值...在客户端检查

答案 2 :(得分:0)

您想要做的是将原始值包含在隐藏字段中,例如Price_orig,然后您可以执行任何操作。如果您不关心客户端验证,那么您需要在模型上实现IValidatableObject。如果您想要客户端验证,那么您可以实现一个自定义属性来检查另一个属性的值,类似于此处描述的属性:

Data validation with custom attributes (AttributeTargets.Class) on EF buddy classes

另一种选择是使用FluentValidation

答案 3 :(得分:0)

只是为了让你知道,我在我的模型上创建了一个保存原始值的新属性,然后在我的模型的Validate方法中实现了IValidatableObject,我已经检查了一下是否有新值小于原始值。这解决了我的问题