he un modelo de vista MVC3 definido como:¿Cómo se valida contra cada cadena en una lista usando Validación fluida?
[Validator(typeof(AccountsValidator))]
public class AccountViewModel
{
public List<string> Accounts { get; set; }
}
Con la validación define utilizando FluentValidation (v3.3.1.0) como:
public class AccountsValidator : AbstractValidator<AccountViewModel>
{
public AccountsValidator()
{
RuleFor(x => x.Accounts).SetCollectionValidator(new AccountValidator()); //This won't work
}
}
Y la validación de la cuenta podría posiblemente ser definidos:
public class AccountValidator : AbstractValidator<string> {
public OrderValidator() {
RuleFor(x => x).NotNull();
//any other validation here
}
}
Me gustaría que cada cuenta en la lista se valdiated como se describe en el documentation. Sin embargo, la llamada al SetCollectionValidator
no funciona, ya que no es una opción cuando se usa un List<string>
aunque la opción estaría allí si se definiera como List<Account>
. ¿Me estoy perdiendo de algo? Podría cambiar mi modelo para usar List<Account>
y luego definir una clase de Cuenta, pero realmente no quiero cambiar mi modelo para adaptarlo a la validación.
de referencia, esta es la vista que estoy usando:
@model MvcApplication9.Models.AccountViewModel
@using (Html.BeginForm())
{
@*The first account number is a required field.*@
<li>Account number* @Html.EditorFor(m => m.Accounts[0].Account) @Html.ValidationMessageFor(m => m.Accounts[0].Account)</li>
for (int i = 1; i < Model.Accounts.Count; i++)
{
<li>Account number @Html.EditorFor(m => m.Accounts[i].Account) @Html.ValidationMessageFor(m => m.Accounts[i].Account)</li>
}
<input type="submit" value="Add more..." name="add"/>
<input type="submit" value="Continue" name="next"/>
}
Gracias, SetCollectionValidator funcionó. ¡No estoy seguro de por qué esta declaración no estaba disponible antes! Sin embargo, todavía no funciona del todo bien. La validación se está utilizando, pero los errores se escriben ahora en el estado del modelo con la clave "Cuentas [0]. Cuentas". Uso ValidationMessageFor (m => m.Cuentas [i]) en la vista para mostrar cada número de cuenta, por lo tanto, ModelState debe tener una clave de "Cuentas [0]". He intentado cambiar OverridePropertyName (collectionName) con un nombre en blanco y eliminar esta declaración por completo, pero todavía no puedo hacer que funcione. – Dangerous
Podría hacerlo funcionar usando @ Html.ValidationMessage ("Cuentas [i] .Cuentas") pero, de nuevo, esto parece ser una alternativa. Aprecio tus pensamientos sobre esto? Gracias de nuevo. – Dangerous
He decidido usar un modelo de Cuenta en lugar de una cadena. Por lo tanto, los errores ahora se informan correctamente. Por lo tanto, el nombre de la colección anterior no es necesario como parámetro. – Dangerous