Как насчет настраиваемого атрибута проверки с включенной проверкой клиента (так что вы получаете проверку как клиента, так и сервера)?В приведенном ниже решении используется ненавязчивая проверка jQuery.Чтобы использовать это, вам нужно дать всем вашим кнопкам конкретные имена и передать имя атрибуту проверки.Кнопка также должна иметь какое-то значение, чтобы ее можно было отправить обратно (чтобы ее мог проверить код на стороне сервера, т. Е. <input type="submit" name="myButton" value="1" />
).Я не проверял этот код, поэтому я не уверен, что он выходит из коробки.Возможно, вам понадобится сделать несколько модов:
Атрибут проверки для вашей модели:
public class RequiredIfButtonClickedAttribute : ValidationAttribute, IClientValidatable
{
private RequiredAttribute _innerAttribute = new RequiredAttribute();
public string ButtonName { get; set; }
public RequiredIfButtonClickedAttribute(string buttonName)
{
ButtonName = buttonName;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if ((value == null && !string.IsNullOrEmpty(HttpContext.Current.Request.Form[ButtonName])))
{
if (!_innerAttribute.IsValid(value))
{
return new ValidationResult(this.ErrorMessage, new[] { validationContext.MemberName });
}
}
return ValidationResult.Success;
}
#region IClientValidatable Members
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule() { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "requiredifbuttonclicked" };
rule.ValidationParameters.Add("buttonname", ButtonName);
yield return rule;
}
#endregion
}
Клиентскрипт:
/// <reference path="jquery-1.4.4-vsdoc.js" />
/// <reference path="jquery.validate.unobtrusive.js" />
// When a button is clicked remove the clicked button class from all buttons and add it to the on that was clicked
$(":submit").click(function () {
$(":submit").removeClass('clickedButton');
$(this).addClass('clickedButton');
});
$.validator.addMethod('requiredifbuttonclicked',
function (value, element, parameters) {
// if the condition is true, reuse the existing
// required field validator functionality
if ($(".clickedButton").val("name") === parameters['buttonname'])
return $.validator.methods.required.call(
this, value, element, parameters);
return true;
}
);
$.validator.unobtrusive.adapters.add(
'requiredifbuttonclicked',
['buttonname'],
function (options) {
options.rules['requiredifbuttonclicked'] = {
buttonname: options.params['buttonname']
};
options.messages['requiredifbuttonclicked'] = options.message;
});
И используйте его так:
[RequiredIfButtonClicked("myButtonName")]
public string Name { get; set; }