0

我有一个包含表单的 ViewModel:

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

在加载此视图的控制器操作中,我设置了价格并将其传递给视图。例如,我将其设置为 3:

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

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

4

4 回答 4

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 的自定义属性并将相同的逻辑放在 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;
     }
}
于 2012-04-04T15:02:00.430 回答
0

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

于 2012-04-04T15:03:28.757 回答
0

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

在 EF 伙伴类上使用自定义属性 (AttributeTargets.Class) 进行数据验证

另一种选择是使用FluentValidation

于 2012-04-04T15:41:21.500 回答
0

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

于 2012-04-05T09:22:13.167 回答