MVC 5 - 默认单选按钮,未选择任何内容

时间:2017-06-13 14:19:53

标签: jquery asp.net-mvc-5 razorengine

我有一个带有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?

由于

2 个答案:

答案 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]