2010-04-16 20 views
34

ho una casella di testo che sto definendoli comemodello vincolante con Casella di testo disabili

<%= Html.TextBox("Username", Model.Form.Username, 
     new { @class = "textbox", @disabled = "disabled" })%> 

Nella mia azione

[AcceptVerbs(HttpVerbs.Post)] 
    [ValidateAntiForgeryToken] 
    public ActionResult EditLogin(LoginForm post) { 

     ... 

     return View(model); 
    } 

post.Username sarà vuoto, tutte le altre proprietà si legano in modo corretto, ma se io change @ disabled = "disabled @ readonly =" readonly "il nome utente si collega correttamente e tutto funziona

Sembra che il binding del modello ignori i valori nei campi disabilitati. Ho bisogno del valore del campo per legare al modello. Posso usare readonly ma preferisco usare disabilitato quindi è visivamente evidente all'utente che non è possibile modificare il valore del campo.

risposta

52

Credo che un campo modulo disattivato non presenti nulla. Se hai un modulo e disabiliti il ​​campo foo in quel modulo, quando pubblichi il post non avrà il valore per il campo foo. Questa è semplicemente la natura della disabilitazione di un campo in HTML e non è un problema MVC.

+3

Wow, non posso credere che non ho eseguito in questo prima, uno che o completamente dimenticato su di esso. Grazie. – modernzombie

+0

È una cosa facile da trascurare ma Dan Diplo ha ragione, in molti casi un campo nascosto è una buona strada da percorrere. Per curiosità, perché stai disabilitando un campo username? –

+0

Sto creando un modulo in cui un amministratore può creare nuovi accessi per il sistema. Stavo disabilitando il nome utente quando l'amministratore stava modificando l'accesso (il nome e il cognome e le e-mail sono modificabili) perché il nome utente non può essere modificato. Ho deciso di usare readonly e posso usare alcuni CSS per colorare il campo in modo diverso. – modernzombie

5

Se si desidera che il valore venga restituito, ma non modificabile, è consigliabile posizionarlo in un campo nascosto. Ovviamente, non farlo per qualcosa che richiede un certo livello di sicurezza, dal momento che un utente può manometterlo.

40

uso readonly - disattiverà l'input ma lo avrete ancora nell'associazione. Potresti applicare uno stile al div per renderlo in grigio?

<div class="editor-label"> 
    @Html.LabelFor(model => model.FileName) 
</div> 
<div class="editor-field-greyed-out"> 
    @Html.TextBoxFor(model => model.FileName, new { @readonly = true }) 
    @Html.ValidationMessageFor(model => model.FileName) 
</div> 
+0

Bella risposta per l'OP ... Grazie :) – Tushar

+1

Sono venuto qui perché ho avuto lo stesso problema per un dropdownbox, per il futuro ppl readonly non funziona per un menu a discesa :) – FRoZeN

5

Si può fare una soluzione con l'aggiunta di un campo nascosto con lo stesso valore;)

<%= Html.Hidden("Username", Model.Form.Username)%> 
+0

Quindi l'elemento (s) non è un codice HTML valido e potrebbe causare mal di testa con javascript. – QMaster

1

modo più semplice per inviare i campi disabili è per copiarli verso un invisibile, il controllo non disattivato prima di presentare . Alcune persone creano manualmente questi controlli e collegano l'evento on change in jQuery per copiarli su richiesta, ma questa soluzione è generica, facile e meno chatty - anche se una regola: è necessario creare (renderizzare) una pagina pulita dopo il postback (così

$('#submitBtn').closest('form').one('submit', function() { 

    var $form = $(this); 

    // input, textarea, select, option, ----- button, datalist, keygen, output, optgroup 
    $form.find('input:disabled, textarea:disabled, select:disabled, option:disabled').each(function() { 

     var $item = $(this); 

     var hiddenItem = $item.clone(); 
     hiddenItem.removeAttr('id'); 
     hiddenItem.removeAttr('disabled'); 
     hiddenItem.attr('style', 'display: none'); 

     $item.after(hiddenItem); 
    }); 

}); 
+0

tizio geniale! Ma puoi anche apportare alcune modifiche e mettere questo methon onload – clement

+0

Questo funziona, ma è eccessivo. Se stai già utilizzando jQuery, modifica la proprietà disabilitata su false al submit. Vedi la mia risposta. –

3

Come suggerito nei commenti, in sola lettura al posto del disabile può essere un'opzione ma non funzionerà con le caselle selezionate, invece di creare un input nascosto, puoi farlo p l'input o seleziona come disabilitato e passa ancora i dati modificando la proprietà disabilitata con JavaScript al submit.

utilizzando jQuery che sarebbe simile a questa:

$('form').on('submit', function(){ 
    $('input, select').prop('disabled',false); 
    return true; 
}); 
Problemi correlati