Così ho un'entità nella mia Models
directory:Come mantenere le regole di validazione all'interno dell'entità mentre si utilizza un modello di visualizzazione all'interno del controller?
public class Event
{
public int Id { get; set; }
[Required, MaxLength(50), MinLength(3)]
public string Name { get; set; }
[Required, MaxLength(2000)]
public string Description { get; set; }
}
e voglio esporlo a vista con un ViewModel:
public class BaseEventViewModel
{
public string Name { get; set; }
[DataType(DataType.MultilineText)]
public string Description { get; set; }
}
public class EventCreateViewModel : BaseEventViewModel
{
}
Il mio ragionamento alla base di questo è che io voglio tutti i convalida dei dati da eseguire sull'entità e tutti gli elementi di presentazione (come il rendering di un'area di testo) da eseguire sul modello di visualizzazione. Quindi posso usare comunque molti modelli di visualizzazione che voglio rappresentare la mia entità, pur mantenendo l'integrità dei dati.
Così ho cambiato il mio controller per utilizzare la nuova vista del modello:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(EventCreateViewModel viewModel)
{
if (ModelState.IsValid)
{
db.Events.Add(new Event
{
Name = viewModel.Name,
Description = viewModel.Description
});
db.SaveChanges();
return RedirectToAction("Index");
}
return View(viewModel);
}
Tuttavia nessuno dei convalida entità viene fatto e sono in grado di presentare un modulo vuoto che solleva un'eccezione DbEntityValidationException
.
Presumibilmente perché ModelState.IsValid
funziona sul modello di visualizzazione, non sull'entità rappresentata dal modello di visualizzazione. Come posso prendere questi errori di validazione?
Speravo ci sarebbe una soluzione più pulita a questo punto, poiché ora avrò le stesse annotazioni di dati sparse su più modelli di visualizzazione. Se ne cambio uno, devo ricordarmi di cambiarli tutti. :/ –
Non necessariamente. Se non stai facendo nulla con i dati che ricevi da ViewModel, non c'è motivo di convalidare di nuovo. Devi solo convalidare se il tuo programma sta modificando l'input dell'utente. –
@KingIsaac: la vista non dovrebbe essere attendibile, il controllore non dovrebbe considerare attendibile, il database non dovrebbe fidarsi del chiamante. La validazione su ogni passaggio (anche db) è una buona idea e non dovrebbe essere saltata. – fex