risposta a cura
Rileggendo la tua domanda, suona come si vuole solo sapere se si seleziona un valore. Se questo è il caso, allora basta applicare il RequiredAttribute
alla proprietà Guid
e rendere annullabile sul modello
public class GuidModel
{
[Required]
public Guid? Guid { get; set; }
public IEnumerable<Guid> Guids { get; set; }
}
poi nel fortemente tipizzato View (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 --")
Aggiungere lo script JavaScript convalida del client riferimenti per la validazione lato client.
Il controller sembra
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");
}
}
Questo farà sì che la proprietà Guid
è richiesto per un modello-bound GuidModel
.
risposta originale
Non credo che ci sia un attributo ready made dati di annotazione di convalida che è in grado di fare questo. Ho scritto a blog post about one way to achieve this; il post sta usando un contenitore IoC ma potresti prendere la dipendenza hard coded se vuoi far funzionare qualcosa.
Qualcosa di simile
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;
}
}
e poi sul modello che si invia in azione di controllo
public class GuidModel
{
[ValidGuid]
public Guid guid { get; set; }
}
Questo ti dà la validazione lato server. Puoi scrivere anche la convalida lato client per fare questo, magari usando RemoteAttribute
ma in questo caso non vedo molto valore in quanto le uniche persone che vedranno questa convalida lato client sono le persone che fanno scherzi ai valori nel DOM; non sarebbe di nessun beneficio per il tuo normale utente.
Che in realtà non funzionerà se non si contrassegna la proprietà Guid come annullabile, vedere la mia risposta. –
@NickAlbrecht grazie, corretto –