MVC 4 modello Personalizzato per bool (rasoio)

Sto utilizzando twitter bootstrap framework, in modo da ottenere il EditorFor e DisplayFor metodi per l’output di cosa ho bisogno, ho creato un template personalizzato per ciascuno dei tipi come stringa di testo, password, etc. Per la mia pagina di login ho voglia di un RememberMe bool, così come prima, ho creato il seguente modello e messo in Boolean.cshtml:

@model bool

<div class="control-group">
    <div class="controls">
        <label class="checkbox">
            @Html.CheckBoxFor(m => m, new {@class = "checkbox"})
            @Html.LabelFor(m => m)
        </label>
    </div>
</div>

Abbastanza semplice, ma quando uso:

@Html.EditorFor(m => m.RememberMe)

Ottengo un’eccezione dicendo che il valore bassed non può essere null:

The model item passed into the dictionary is null, but this dictionary requires a non-null model item of type 'System.Boolean'.

Che cosa mi manca? Sembra come dovrebbe essere dritto in avanti. Il campo sul modello in oggetto appare come segue:

[Display(Name = "Remember me?")]
public bool RememberMe { get; set; }

Grazie.

AGGIORNAMENTO: Così sembra che, alla fine, è una questione di creare un vuoto di vista del modello di oggetto e passando per la vista, invece di lasciare MVC creare uno su di essa la propria.

  • Potresti provare a impostare il RememberMe valore di default con dataannotations [DefaultValue(false)]

 

4 Replies
  1. 18

    Non vorrei farlo in quel modo. Se il valore non può essere null, vorrei fare in modo che il vostro modello di editor è nullable booleano come il tipo di modello. Così il vostro modello di editor (in Vista\Condivisa\EditorTemplates\Booleano.cshtml) sarebbe:

    @model Boolean?
    
    @Html.CheckBox("", Model.HasValue && Model.Value)

    E poi il rasoio principale di vista, si potrebbe avere:

    <div class="control-group">
        <div class="controls">
            <label class="checkbox">
                @Html.EditorFor(m => m, new {@class = "checkbox"})
                @Html.LabelFor(m => m)
            </label>
        </div>
    </div>
    • Mi piace questo approccio. Boolean non possono di norma essere null (non nel modello oggetto che stavo utilizzando, in ogni caso), ma penso che questo approccio consentirebbe di lavorare con standard MVC modo di chiamare la vista è piuttosto che la creazione di un nuovo modello vuoto oggetto. NOTA: io in realtà penso che questa è una risposta concreta alla mia domanda originale, la mia risposta era una soluzione.
  2. 0

    Leggendo le risposte finora, ho cominciato a chiedermi di come il modello in oggetto è in fase di inizializzazione. Quindi, questo è piuttosto strano, ma ho trovato la risposta. Speriamo che qualcuno in grado di spiegare la stranezza. Potrebbe essere come MVC inizializza un oggetto del modello, se non si specifica una.

    Predefinito MVC Internet modello è il seguente per l’azione di Login:

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        ViewBag.ReturnUrl = returnUrl;
    
        return View();
    }

    Che dà l’errore. La modifica è la seguente, però, il problema si risolve:

    [AllowAnonymous]
    public ActionResult Login(string returnUrl)
    {
        var loginModel = new LoginModel();
    
        ViewBag.ReturnUrl = returnUrl;
    
        return View(loginModel);
    }

    In modo che questo risponda alla domanda su come risolvere il problema, ma lascia ancora il motivo non risolti. Potrebbe essere perché MVC crea un’istanza dell’oggetto in modo diverso, a dire con la riflessione o qualcosa del genere?

    • Sembra che nel primo esempio, NON sono l’impostazione di un modello di visualizzazione – ma la Vista è previsto uno…e quindi la proprietà (e modello) sono null. Controlla l’errore attentamente come mi sarei aspettato null essere il modello e non la proprietà iteself. Secondo esempio si sono esplicitamente la creazione di un’istanza del modello di visualizzazione, in modo che il mondo è un bel posto.
    • Sì, che sembra essere quello che sta succedendo. Che il primo bit è l’impostazione predefinita modello MVC codice e funziona normalmente. Presumo che MVC crea il modello di visualizzazione da qualche parte lungo la strada, ma non abbastanza presto per il modello personalizzato.
    • La differenza è che MVC3 EditorFor<> è un metodo di estensione in public static class EditorExtensions ritorno MvcHtmlString. Questo significa che su un valore null è in grado di gestire e restituire la casella vuota. Il mio consiglio: a) di mantenere con quello che hai…si può anche aggiungere returnUrl per il modello, se volete. b) nella visualizzazione, aggiungere un @blocco di codice e impostare un locale bool per la casella di controllo. c) aggiungere un editorfor come il tuo metodo di estensione di ritorno mvchtmlstring. Infine: Qual è il motivo per escludere l’EditorFor<bool> con il tuo editor di template? Può essere fatto con i css invece?
  3. 0

    Si potrebbe modificare il modello in modo che accetti i valori null come “sì”/”no”

    public bool? RememberMe { get; set; }
  4. -1

    È necessario inizializzare il RememberMe bool value all’interno del costruttore, come illustrato di seguito.

    Ricordare che l’uso di variabili non inizializzate in C# non è consentito.

    using System.ComponentModel; 
    
    public class ClassName
     {    
       public ClassName ()
            {
                RememberMe = false;
            }
    
       [DefaultValue(false)]
       [Display(Name = "Remember me?")]
       public bool RememberMe { get; set; }
     }

    Per ulteriori informazioni controllare Valori di Default della Tabella

    Spero che questo aiuto a voi.

    • Solo i tipi di riferimento ha null come valore predefinito. Bool è un tipo di valore e il valore predefinito per il bool false.. OP è un semplice bool di proprietà di un non nullable bool (e.g bool?).
    • Grazie per la correzione.Ho aggiornato il mio post.
    • La mia impressione è stata che bool avrà un valore predefinito è false. Comunque, ho provato sia impostando a false nel costruttore e la proprietà DefaultValue con gli stessi risultati di prima. Mi chiedo se ho qualcosa di sbagliato con il modello. Quando l’ho direttamente nel codice con @Html.ComboBoxFor, che funziona bene, quindi il valore è impostato.
    • puoi mettere tutta la classe relative a “@modello bool” modello ?
    • public class LoginModel { [Richiesta] [Display(Nome = “nome Utente”)] public string Username { get; set; } [Richiesta] [Tipo(Tipo di dati.Password)] [Display(Name = “Password”)] public string Password { get; set; } [Display(Name = “Ricordi di me?”)] public bool RememberMe { get; set; } }

Lascia un commento