Отредактированный ответ
После перечитывания вашего вопроса звучит так, будто вы просто хотите узнать, выбрано ли значение. Если это так, тогда просто примените 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");
}
}
Это гарантирует, что свойство Guid
требуется для привязки к модели GuidModel
.
Оригинальный ответ
Я не верю, что есть готовый атрибут проверки аннотации данных, способный сделать это. Я написал в блоге об одном способе достижения этой цели ; пост использует контейнер 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; это не принесет пользы вашему обычному пользователю.