Domanda

sto usando DataAnnotations attributi per convalidare i miei oggetti del modello. La mia classe del modello è simile a questo:

public class MyModel
{
    [Required]
    public string Title { get; set; }

    [Required(ErrorMessage = "At least one editor is required.")]
    public List<User> Editors { get; set; }
}

public class User
{
    public int Id { get; set; }

    [Required]
    public string FullName { get; set; }

    [Required]
    [DataType(DataType.Email)]
    public string Email { get; set; }
}

La mia azione di controllo si presenta come:

public ActionResult NewItem(MyModel data)
{
    if (!this.Model.IsValid)
    {
        // invalid processing
    }
    // valid processing
}

utente è presentato con una vista che ha un modulo con:

  • una casella di testo con il nome fittizio cui gli utenti inseriscono i nomi degli utenti. Per ogni utente che entrano, c'è uno script client accoppiata con l'Ajax che crea un <input type="hidden" name="Editors[0].Id" value="userId" /> per ogni utente inserito (indice di enumerazione non è quindi sempre 0 come scritto qui), in modo da legante modello predefinito è in grado di consumare e associare il modulo senza problemi.
  • una casella di testo in cui gli utenti entrano nel titolo

Dal momento che sto usando Asp.net MVC 2 RTM , che fa la validazione dei modelli, invece di validazione dell'input non so come evitare gli errori di convalida. E dal momento che gli utenti forniscono User.Id, l'intera istanza dell'oggetto User viene convalidato. Il che non mi preoccupa, finché io saprei come escludere la convalida altre proprietà.

Il fatto è che devo usare BindAttribute sulla mia azione del controller. Avrei dovuto presentare una bianca o una lista nera di proprietà. E 'sempre una pratica migliore per fornire una lista bianca. E 'anche la prova più futuro.

Il problema

Il mio modulo funziona benissimo, ma ottengo gli errori di convalida circa FullName e Email proprietà dell'utente in quanto non sono forniti. Anche io non li dovrebbe nutrire al cliente (tramite la tecnologia AJAX quando l'utente inserisce i dati degli utenti), in quanto la posta elettronica è dati di contatto personale e non è condivisa tra gli utenti.

Se ci fosse solo un riferimento per l'utente singolo MyModel avrei scritto

[Bind(Include = "Title, Editor.Id")]

Ma ho un'enumerazione di loro. Come faccio a fornire lista bianca Bind a lavorare con il mio modello?

Una possibile soluzione

ho potuto creare un modello di vista separato per User solo per il gusto di entrare oggetti MyModel. Io metterei attributi reali di validazione e omettere proprietà non ho bisogno.

public class MyModelUser
{
    [Required]
    public int Id { get; set; }
}
È stato utile?

Soluzione

Ho finito per usare un modello di vista separata (come descritto in Una possibile soluzione nella mia domanda), che può essere completamente convalidati. Si tratta di una soluzione e mi sarebbe ancora sapere come farlo correttamente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top