首页
学习
活动
专区
圈层
工具
发布

验证Guid
EN

Stack Overflow用户
提问于 2011-08-25 16:55:17
回答 7查看 30.1K关注 0票数 18

我有一个强类型视图,它有一个DropDownListFor属性。

下拉列表中的每一项都由GUID表示。

我想要的是一种验证用户是否从下拉列表中选择一项的方法。目前,我还没有看到使用数据注解来做这件事。

有没有办法使用数据注释来实现这一点,这样客户端和服务器端的验证就可以工作了。

我猜我需要做一个自定义的方法来做这件事,但是我想知道是否已经存在了。

EN

回答 7

Stack Overflow用户

发布于 2011-08-25 17:05:17

编辑的应答

在重新阅读您的问题时,听起来您只是想知道是否选择了某个值。如果是这样,那么只需将RequiredAttribute应用于Guid属性,并使其在模型上可为空

代码语言:javascript
复制
public class GuidModel
{
    [Required]
    public Guid? Guid { get; set; }

    public IEnumerable<Guid> Guids { get; set; }
}

然后在强类型视图中(使用@model GuidModel)

代码语言:javascript
复制
@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脚本引用。

控制器看起来像

代码语言: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容器,但是如果你想让一些东西工作,你可以使用硬编码的依赖项。

就像这样

代码语言:javascript
复制
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;
    }
}

然后在您发送到控制器操作中的模型上

代码语言:javascript
复制
public class GuidModel
{
    [ValidGuid]
    public Guid guid { get; set; }
}

这将为您提供服务器端验证。您也可以编写客户端验证来实现这一点,也许可以使用RemoteAttribute,但我认为在这种情况下没有太大的价值,因为只有在DOM中处理值的人才会看到这种客户端验证;这对普通用户没有任何好处。

票数 12
EN

Stack Overflow用户

发布于 2016-11-16 20:09:11

我知道这是一个老问题,但是如果其他人感兴趣,我可以通过创建一个IsNotEmpty注释来解决这个问题(在我的例子中,不能选择将Guid设为空)。

这将使用反射来判断属性上是否有Empty的实现,如果有,则对其进行比较。

代码语言:javascript
复制
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);

    }
}
票数 5
EN

Stack Overflow用户

发布于 2020-09-08 11:08:15

正则表达式确实可以工作(如果您使用的是正确的!)

代码语言:javascript
复制
[Required]
[RegularExpression("^((?!00000000-0000-0000-0000-000000000000).)*$", ErrorMessage = "Cannot use default Guid")]
public Guid Id { get; set; }
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7187576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档