我在mvc中有这个验证
public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
var requeridos = item.Requeridos.Select(x => x.Login).Any();
var informados = item.Informados.Select(y => y.Login).Any();
var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();
if (requeridos == informados || requeridos == opcionais || informados == opcionais)
return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
return ValidationResult.Success;
}
我尝试在行中添加不同的
var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();
但显示错误
错误3无法将类型'string'隐式转换为'bool'
z.Login 是字符串
验证是使该字段没有接收null的值。
如果没有它,它会突发错误。
我希望他收到null而不会给出错误。
如果同一个登录位于其他列表中,则选择列表中的z.login。他是错误。
我怎么能“如果”那样做?
答案 0 :(得分:1)
如果z.Login
是一个字符串,则该表达式无效:
z.Login ? z.Login : null
该表达式中的第一个元素必须是bool
。在这种情况下你究竟想要检查什么? z.Login
是否为null
?如果是这种情况,那么您根本不需要条件:
.Select(z => z.Login)
由于您只是将null
替换为null
。或者,如果您想将空字符串解释为null
,那么您可以使用以下内容:
.Select(z => string.IsNullOrEmpty(z.Login) ? nulll : z.Login)
虽然首先要用这行代码完成完成的内容并不是很清楚。 .Any()
将返回bool
,指示集合中是否存在任何匹配元素。但是由于你没有在.Any()
中使用谓词,如果集合中有任何元素,它将返回true
。这不仅使.Select()
呈现无意义,而且也没有告诉您.Select()
中有关该条件的任何信息。
也许您正在尝试查找集合中是否有任何 null
值?:
item.Opcionais.Any(z => z.Login == null)
或任何“null或empty”值?:
item.Opcionais.Any(z => string.IsNullOrEmpty(z.Login))
或相反,任何非空值?:
item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login))
依旧......
答案 1 :(得分:0)
我认为你要做的是检查Login是否为null或为空。假设您希望opcionais
是基于.Any()
语句的布尔值:
var opcionais = item.Opcionais.Select(z => z.Login ? z.Login : null).Any();
应该是
var opcionais = item.Opcionais.Any(z => !string.IsNullOrEmpty(z.Login));
答案 2 :(得分:0)
z.Login是一个字符串
验证是使该字段没有接收null的值。
这样做:
修改:更新此部分以查找重复项
public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
var requeridos = item.Requeridos.Any(x => string.IsNullOrWhiteSpace(x.Login));
var informados = item.Informados.Any(x => string.IsNullOrWhiteSpace(x.Login));
var opcionais = item.Opcionais .Any(x => string.IsNullOrWhiteSpace(x.Login));
//does every item have a value?
if (requeridos || informados || opcionais)
return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
//are all of the items unique?
if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() >
item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
{
//some items are duplicated
}
return ValidationResult.Success;
}
而且,为了好玩,避免重复代码:
public static ValidationResult validaUsuariosNaLista(Reuniao item)
{
var HasEmptyValue = s => s.Any(x => string.IsNullOrWhiteSpace(x.Login));
//does every item have a value?
if (HasEmptyValue(item.Requeridos) || HasEmptyValue(item.Informados) || HasEmptyValue(item.Opcionais))
return new ValidationResult(Resources.Validations.ValidaUsuarioMesmaLista);
//are all of the items unique?
if (item.Requeridos.Count() + item.Informados.Count() + item.Opcionais.Count() >
item.Requeridos.Concat(item.Informados).Concat(item.Opcionais).Distinct().Count)
{
//some items are duplicated
}
return ValidationResult.Success;
}
虽然我不是100%关于类型推断在这里工作得多好......我必须看看编译器对它做了什么,并且我没有你的类型进行测试。但最糟糕的是,你必须明确var
声明。