respuesta Editado
Al volver a leer su pregunta, parece que lo que desea saber si se ha seleccionado un valor. Si ese es el caso, entonces simplemente aplicar el RequiredAttribute
a la propiedad Guid
y que sea anulable en el modelo
public class GuidModel
{
[Required]
public Guid? Guid { get; set; }
public IEnumerable<Guid> Guids { get; set; }
}
continuación, en la vista fuertemente tipado (con @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 --")
Añadir la secuencia de comandos JavaScript validación del cliente referencias para la validación del lado del cliente.
El controlador se parece
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");
}
}
Esto asegurará que no se requiere la propiedad Guid
para un modelo enlazado GuidModel
.
respuesta original
no creo que hay un hecho atributo de anotación de datos de validación listo que es capaz de hacer esto. Escribí a blog post about one way to achieve this; la publicación utiliza un contenedor IoC, pero puede tomar la dependencia codificada si quiere que algo funcione.
Algo así como
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;
}
}
y luego en el modelo que usted envía a la acción del controlador
public class GuidModel
{
[ValidGuid]
public Guid guid { get; set; }
}
Esto le da la validación del lado del servidor. También puede escribir la validación del lado del cliente para hacer esto, tal vez usando RemoteAttribute
, pero no veo mucho valor en este caso, ya que las únicas personas que verán esta validación del lado del cliente son personas que están jugando con valores en el DOM; no sería beneficioso para su usuario normal.
Eso realmente no funcionará a menos que marque la propiedad Guid como nulable, vea mi respuesta. –
@NickAlbrecht gracias, corrigió –