Grettings мои друзья ...Защищенное MVC проверки 5 deppending
Так у меня есть набор флажков, которые я установил в моей модели:
[DisplayName("Páginas Consultadas")]
public List<CheckBoxes> PaginasConsultadas { get; set; }
И у меня есть fieldtext ("ParaQueUsaEstasPag"), что требуется только, если любой из флажков ИТС проверено ...
[DisplayName("¿Para que usa esta(s) página(s)?")]
public string ParaQueUsaEstasPag { get; set; }
и часть обзора:
<div class="col-lg-4" id="DivPagConsultadas">
<span>@Html.LabelFor(model => model.PaginasConsultadas, @Html.DisplayNameFor(model => model.PaginasConsultadas))</span>
@{
for (int i = 0; i < Model.PaginasConsultadas.Count(); i++)
{
<div class="checkbox">
<label>
@Html.CheckBoxFor(model => model.PaginasConsultadas[i].ValorCheckBox) @Model.PaginasConsultadas[i].NombreCheckBox
</label>
</div>
@Html.HiddenFor(model => model.PaginasConsultadas[i].valorRespuesta, new { @Value = @Model.PaginasConsultadas[i].valorRespuesta })
}
}
</div>
</div>
<br />
<div class="row">
<div class="col-lg-12">
@Html.LabelFor(model => model.ParaQueUsaEstasPag, @Html.DisplayNameFor(model => model.ParaQueUsaEstasPag))
@Html.TextAreaFor(model => model.ParaQueUsaEstasPag, 5, 1, new { @class = "form-control", placeholder = "Esta pregunta se responde con base en la respuesta de la pregunta anterior" })
@Html.ValidationMessageFor(model => model.ParaQueUsaEstasPag)
</div>
</div>
<br />
<div class="row">
<div class="col-lg-12">
<button type="submit" class="btn btn-default" onclick="dispararPleaseWait()">Enviar Encuesta...</button>
</div>
</div>
Существует режим для этого, используя Foolproof (i.e [RequiredIf])?
Update: Следуйте идею ELAD, мой класс является следующим:
public class PagSeleccionadasValidation : ValidationAttribute, IClientValidatable
{
//todo
private readonly String _ChkPagSel;
public PagSeleccionadasValidation(String ChkPagSel)
{
_ChkPagSel = ChkPagSel;
}
public string P {get; set;}
protected override ValidationResult IsValid(object value, ValidationContext validationcontext)
{
if (value == null)
{
var PropertyInfo = validationcontext.ObjectType.GetProperty(_ChkPagSel);
var Lista = (List<CheckBoxes>)PropertyInfo.GetValue(validationcontext.ObjectInstance, null);
bool HayAlgunaCheck = Lista.Any(r => r.ValorCheckBox == true);
if (HayAlgunaCheck)
{
return new ValidationResult(this.ErrorMessageString);
}
else
{
return ValidationResult.Success;
}
}
return ValidationResult.Success;
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "valpagselecc"
};
rule.ValidationParameters["valpag"] = P;
yield return rule;
}
}
В JS называемых "JS-ValPagSel.js" я поставил это:
$.validator.unobtrusive.adapters.addSingleVal('valpagselecc', 'valpag');
$.validator.addMethod('valpagselecc', function (value, element, params) {
//var checkValue = [Find element via jquery from the params.checkpropertinputname];
if (value) {
return false; // just for test
}
else {
return false;
}
});
И в представлении:
<script src="/Scripts/jquery-1.10.2.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.min.js"></script>
<script src="/Scripts/bootstrap.js"></script>
<script src="/Scripts/respond.js"></script>
<script src="/Scripts/blur.js"></script>
<script src="/Scripts/jquery-ui-1.11.1.js"></script>
<script src="/Scripts/jquery.validate.js"></script>
<script src="/Scripts/jquery.validate.unobtrusive.js"></script>
<script src="/Scripts/Custom/JS-ValPagSel.js"></script>
<textarea class="form-control" cols="1" data-val="true" data-val-valpagselecc="El campo ¿Para que usa esta(s) página(s)? no es válido." data-val-valpagselecc-valpag="" id="ParaQueUsaEstasPag" name="ParaQueUsaEstasPag" placeholder="Esta pregunta se responde con base en la respuesta de la pregunta anterior" rows="5"></textarea>
Вы не можете установить этот тип проверки (условной) на 'уровне ViewModel'. Это должно быть в вашем «действии» –
@ Dejan.S объясните сами. Я понял, что с Foolproof может быть возможным ... –
Я имею в виду, я не думаю, что он обрабатывает список bools. Но посмотрите пример с Педро Матосом, создав обычную. –