Domanda

Ho una forma semplice in ASP.NET MVC. Sto cercando di inviare i risultati ad un'azione di controllo e sto ottenendo un comportamento strano.

Il view è una semplice tabella HTML:

Immagine di vista

Ecco parte del modulo HTML Vista:

 <form action="/Applications/UpdateSurvey" method="post"><table id=questionsTable class=questionsTable border=1>
<thead><tr><td>Name</td><td>Answer</td><td>Name Attribute(for debugging)</td></tr>         </thead><tbody>
 <tr>
 <td>Question 0:</td>

 <td><input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[0].responseIds' value=5 >5&nbsp;&nbsp;</td>
 <td>updater.questions[0].responseIds</td>
 </tr>
 <tr>
 <td>Question 1:</td>
 <td><input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=1 >1&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=2 >2&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=3 >3&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=4 >4&nbsp;&nbsp;<input type='checkbox' class='checkboxes' name='updater.questions[1].responseIds' value=5 >5&nbsp;&nbsp;</td>

 <td>updater.questions[1].responseIds</td>
 </tr>
 </tbody></table>

  <input type="submit" value="Save" />

 </form>

Oggetto Binding:

public class SurveyUpdater
{
    public Question[] questions { get; set; }
}

public class Question
{
    public int[] responseIds { get; set; }
}

Regolatore Codice Azione:

    public ActionResult UpdateSurvey(SurveyUpdater updater)
    {
        if (updater.questions == null)
        {
            //I dont understand why this is getting hit
        }
        if (updater.questions.Length != 5)
        {
            //I dont understand why this is getting hit
        }

        return View("TestSurvey");
    }

Dopo la prova, qui sono le mie osservazioni:

  1. Se ho almeno una CheckBox selezionata su ciascuna delle domande, questo funziona bene e nel mio controller updater.questions.Length == 5 ei dati si lega perfettamente.

  2. Se non rispondo una delle domande a tutti, io ho soltanto un allineamento grande come il numero ho saltato: -1. Quindi, se non ho risposto Domanda # 3, ottengo un array in mia azione del controller di 2.

  3. Utilizzando la logica del 2 #, se non rispondo alla prima domanda, ho semplicemente ottenere null per updater.questions

Quello che voglio ottenere (e quello che mi aspettavo) è che:

Vorrei sempre avere questions con una lunghezza di 5 e nei casi in cui non ho risposto una delle domande, vorrei semplicemente ottenere una matrice di dimensioni 0 per quella responseIds indice.

Si tratta di un bug nel modello di ASP.NET MVC vincolante? In caso contrario, c'è qualcosa che mi manca o un modo per ottenere il comportamento desiderato che sto cercando?

È stato utile?

Soluzione

Il problema, credo, è perché quando vengono scelti nessuna selezione, gli ingressi sono nemmeno passati indietro nei parametri di richiesta. Un modo per aggirare questo sarebbe quello di avere un default, casella di controllo nascosto che contiene un valore noto che si potrebbe filtrare selezionato inizialmente per ogni domanda (una casella di controllo "non si risponde", se si vuole). Ciò garantisce che si ottiene una selezione per ogni domanda e che esiste un parametro di richiesta per ogni elemento della matrice.

Pensateci dal punto di vista di ciò che viene pubblicato indietro. Solo quegli elementi che hanno valori, hanno nomi, e non sono disabilitate vengono pubblicati. Se non tutte le domande hanno valori, allora il numero di elementi dell'array dovrebbe creare? Nella migliore delle ipotesi si può intuire che l'ultimo elemento selezionato dovrebbe essere la dimensione della matrice - ma quali valori dovrebbe utilizzare per tutti gli articoli nel mezzo? Il quadro non può leggere la mente e, probabilmente, anche se non dovrebbe fornire il valore di default per il tipo potrebbe essere ragionevole. IMO, sarebbe meglio di omettere solo il valore e, quindi, costringere lo sviluppatore a fornire il default se lo si desidera. Che sembra essere ciò che sta accadendo.

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