我有一个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,则它将是有效的。
答案 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,我已经检查了一下是否有新值小于原始值。这解决了我的问题