84 messaggi dal 11 luglio 2013
Ho una dropdownlist, contenente 3 valori: id 0 = vuoto, id 1 = Nome1, id 2 = Nome2
il codice nella view è:
 <td>
                <b>Preso Da:</b><br />
                <div class="editor-field">
                    @Html.DropDownList("TecnicoID", (SelectList)ViewBag.TecnicoID)<br />
                    @Html.ValidationMessageFor(model => model.TecnicoID)
                </div>
            </td>


Dentro al Model.tt => PC.cs, ho questo codice:

        [CustomTecnico]
        public int TecnicoID { get; set; }
public class CustomTecnicoAttribute : ValidationAttribute
    {
        public override bool IsValid(object value)
        {
            int tecnico = (int)value;
            return tecnico != 0;
        }
    }

In poche parole se il valore del tecnico è = a 0, cioè è vuoto, voglio che venga visualizzato il validationmessage..

Siamo buoni a nulla, ma capaci di tutto.
11.886 messaggi dal 09 febbraio 2002
Contributi
Ciao Anna,
quello che hai fatto dovrebbe funzionare. Quando l'utente salva la maschera di modifica, la tua action riceve l'oggetto contenente i dati che ha inserito. Immagino che in quella action tu abbia del codice tipo questo:
[HttpPost]
public ActionResult NomeTuaAction(PC pc)
{
    if (ModelState.IsValid)
    {
        //i dati erano validi, quindi salvo l'oggetto
        Salva(pc);
        //reindirizzo alla pagina di indice
        return RedirectToAction("NomeTuaActionDiIndice");
    } else {
        //i dati non erano validi, quindi ripropongo la view all'utente
        return View(pc);
    }
}

Se l'utente non ha selezionato un TenicoID valido, la proprietà ModelState.IsValid sarà false e l'utente vedrà la pagina ricaricarsi con la stessa maschera di modifica dati. Di fianco alla dropdownlist però apparirà il messaggio di errore.

Puoi confermare che fin qui succede quanto ho descritto?

Ora bisogna fare una serie di considerazioni.

ciao,
Moreno

Enjoy learning and just keep making
84 messaggi dal 11 luglio 2013
nel Controller ho questo codice:
 [HttpPost]
        public ActionResult Create(PC pc)
        {
            pc.Clienti = db.Clienti.Find(pc.ClienteID);
            pc.Data = DateTime.Now;
            pc.Tecnici = db.Tecnici.Find(pc.TecnicoID);
            db.PC.Add(pc);
            var valid = db.Entry(pc).GetValidationResult();
            if (valid.IsValid)
                db.SaveChanges();
            else
            {
                string err = string.Join(",", valid.ValidationErrors.Select(ve => ve.ErrorMessage));
                err += "";
            }
            
            return RedirectToAction("Index");
        }


La cosa che non capisco è: perchè con gli altri valori che ho messo come richiesti, l'errore viene visualizzato e con Preso Da questo non avviene???

Siamo buoni a nulla, ma capaci di tutto.
11.886 messaggi dal 09 febbraio 2002
Contributi
ciao,

perchè con gli altri valori che ho messo come richiesti, l'errore viene visualizzato e con Preso Da questo non avviene???


Perché l'attributo Required è in grado di causare anche una validazione lato client e dunque all'utente viene impedito di inviare il form se non aveva compilato tutti i campi richiesti.

Con il campo Preso Da questo non avviene perché la validazione è affidata a CustomTecnico, un tuo attributo personalizzato che non dispone di validazione lato client.
Il codice C# che hai scritto nell'override di IsValid non viene automaticamente tradotto in javascript, e perciò il tuo attributo non è in grado di bloccare l'invio del form e far comparire l'errore. Se vuoi che il tuo attributo si comporti come gli altri, bisogna leggere attentamente la procedura descritta nell'articolo che ti avevo postato.
http://www.codeproject.com/Articles/275056/Custom-Client-Side-Validation-in-ASP-NET-MVC3

Tuttavia, secondo me dovresti evitare questa soluzione perché possiamo risolvere il problema in maniera molto più semplice, magari usando gli attributi di validazione che già esistono.
Nel post precedente ti dicevo che puoi usare il Required anche per quel campo, ma ce ne sono anche altri da provare. Ecco un esempio con Range, che, partendo da 1 esclude lo 0 dai valori ammessi.
[Range(1, int.MaxValue)]
public int TecnicoID { get; set; }


ciao,
Moreno
Modificato da BrightSoul il 21 novembre 2013 18.29 -

Enjoy learning and just keep making

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.