我有一个强类型视图,它有一个DropDownListFor属性。
下拉列表中的每一项都由GUID表示。
我想要的是一种验证用户是否从下拉列表中选择一项的方法。目前,我还没有看到使用数据注解来做这件事。
有没有办法使用数据注释来实现这一点,这样客户端和服务器端的验证就可以工作了。
我猜我需要做一个自定义的方法来做这件事,但是我想知道是否已经存在了。
发布于 2011-08-25 17:05:17
编辑的应答
在重新阅读您的问题时,听起来您只是想知道是否选择了某个值。如果是这样,那么只需将RequiredAttribute应用于Guid属性,并使其在模型上可为空
public class GuidModel
{
[Required]
public Guid? Guid { get; set; }
public IEnumerable<Guid> Guids { get; set; }
}然后在强类型视图中(使用@model GuidModel)
@Html.ValidationMessageFor(m => m.Guid)
@Html.DropDownListFor(
m => m.Guid,
Model.Guids.Select(g => new SelectListItem {Text = g.ToString(), Value = g.ToString()}),
"-- Select Guid --")为客户端验证添加客户端验证JavaScript脚本引用。
控制器看起来像
public class GuidsController : Controller
{
public GuidRepository GuidRepo { get; private set; }
public GuidsController(GuidRepository guidRepo)
{
GuidRepo = guidRepo;
}
[HttpGet]
public ActionResult Edit(int id)
{
var guid = GuidRepo.GetForId(id);
var guids - GuidRepo.All();
return View(new GuidModel { Guid = guid, Guids = guids });
}
[HttpPost]
public ActionResult Edit(GuidModel model)
{
if (!ModelState.IsValid)
{
model.Guids = GuidRepo.All();
return View(model);
}
/* update db */
return RedirectToAction("Edit");
}
}这将确保绑定模型的GuidModel需要Guid属性。
原始答案
我不相信有现成的数据注释验证属性能够做到这一点。我写了;这篇文章使用了一个IoC容器,但是如果你想让一些东西工作,你可以使用硬编码的依赖项。
就像这样
public class ValidGuidAttribute : ValidationAttribute
{
private const string DefaultErrorMessage = "'{0}' does not contain a valid guid";
public ValidGuidAttribute() : base(DefaultErrorMessage)
{
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var input = Convert.ToString(value, CultureInfo.CurrentCulture);
// let the Required attribute take care of this validation
if (string.IsNullOrWhiteSpace(input))
{
return null;
}
// get all of your guids (assume a repo is being used)
var guids = new GuidRepository().AllGuids();
Guid guid;
if (!Guid.TryParse(input, out guid))
{
// not a validstring representation of a guid
return new ValidationResult(FormatErrorMessage(validationContext.DisplayName));
}
// is the passed guid one we know about?
return guids.Any(g => g == guid) ?
new ValidationResult(FormatErrorMessage(validationContext.DisplayName)) : null;
}
}然后在您发送到控制器操作中的模型上
public class GuidModel
{
[ValidGuid]
public Guid guid { get; set; }
}这将为您提供服务器端验证。您也可以编写客户端验证来实现这一点,也许可以使用RemoteAttribute,但我认为在这种情况下没有太大的价值,因为只有在DOM中处理值的人才会看到这种客户端验证;这对普通用户没有任何好处。
发布于 2016-11-16 20:09:11
我知道这是一个老问题,但是如果其他人感兴趣,我可以通过创建一个IsNotEmpty注释来解决这个问题(在我的例子中,不能选择将Guid设为空)。
这将使用反射来判断属性上是否有Empty的实现,如果有,则对其进行比较。
public class IsNotEmptyAttribute : ValidationAttribute
{
public override bool IsValid(object value)
{
if (value == null) return false;
var valueType = value.GetType();
var emptyField = valueType.GetField("Empty");
if (emptyField == null) return true;
var emptyValue = emptyField.GetValue(null);
return !value.Equals(emptyValue);
}
}发布于 2020-09-08 11:08:15
正则表达式确实可以工作(如果您使用的是正确的!)
[Required]
[RegularExpression("^((?!00000000-0000-0000-0000-000000000000).)*$", ErrorMessage = "Cannot use default Guid")]
public Guid Id { get; set; }https://stackoverflow.com/questions/7187576
复制相似问题