我有一个带有id =“SendMeCatalog”的“div”,当用户选择购买具有Catalog的产品时,它只显示在页面上。隐藏/显示div由JavaScript控制。原因是因为某些产品没有可用的目录,如果用户选择的产品没有可用的目录,则页面上将隐藏id =“SendMeCatalog”的div。
现在,我有一个Model,它有一个名为SendThemCatalog的必需属性,并且设置为boolean with null-able。原因是因为我想默认单选按钮没有选择任何内容。
[Required]
public bool? SendThemCatalog {get; set; }
注意,我使用[必需]因为我想使用Html.ValidatoinMessageFor(...)来确保选择是/否。默认情况下,未选择任何内容。
@Html.ValidationMessageFor(model => Model.SendThemCatalog, "Please select Yes/No")
现在,我的问题是,当用户选择没有可用目录的产品时 - >这意味着id =“SendMeCatalog”的div将被隐藏 - >然后,当用户提交httppost请求时,我有一个ModelState无效错误。该错误与SendThemCatalog属性有关。
我该怎么做才能克服这个问题?当用户选择没有可用目录的产品时,如何确保将SendThemCatalog设置为False?
由于
答案 0 :(得分:1)
在服务器端,您可以通过创建自定义HasCatalog(int ProductId)
方法并使用ModelState.Remove
方法,根据具体情况省略模型验证错误。
如果您的模型与其他人有关系,您还可以检查产品Catolog计数,而不是使用HasCatalog(int ProductId)
有一个关于ModelState.Remove
public class TestController : Controller
{
[HttpPost]
public ActionResult Index(YourModel model)
{
if(!HasCatalog(model.ProductId)) // add your condition here
ModelState.Remove("SendThemCatalog"); // to omit SendThemCatalog Validation Error
if(ModelState.IsValid)
{
//Do some stuff, eventually redirect elsewhere
}
return View(model);
}
}
答案 1 :(得分:0)
我会使用CustomValidationAttribute
,如下所示:
首先,创建一个验证方法,由CustomValidationAttribute
API(see the doc预定义的签名是谁。请注意,返回值中存在错误。它应该是{{1 },而不是ValidationResult
)。例如,
bool
即,与public static ValidationResult ValidateSendThemCatalog(bool? value, ValidationContext context)
{
ValidationResult result = ValidationResult.Success;
YourModel yourModel = context.ObjectInstance as YourModel;
if (yourModel.HasCatalog && value == null)
{
result = new ValidationResult($"{context.DisplayName} is required.");
}
return result;
}
(ValidationResult
不同的任何ValidationResult.Success
都会触发验证错误。
接下来,使用null
属性装饰您的媒体资源:
[CustomValidation]