ASP.NET MVC 3: sovrascrivere l'attributo "nome" con TextBoxFor


99

È possibile quando si utilizza Html.TextBoxForper sostituire l'attributo name?

Ho provato senza successo. Devo utilizzare TextBoxFor per far funzionare la convalida lato client, tuttavia per motivi che non entrerò ho bisogno che il nome della casella di testo sia diverso da quello generato.

Ho provato quanto segue:

@Html.TextBoxFor(x => x.Data, new { name = Model.Key + "_Data", id = Model.Key + "_Data" })

Che funziona per ID ma non per nome. È possibile?

Aggiornamento : esaminando il codice per TextBoxFor. Non sembra che ci sia un modo semplice. Spero che qualcuno possa dimostrare che ho torto.


Qual è il tipo di dati di 'Dati'
archil


2
Quelle domande stanno chiedendo qualcosa di leggermente diverso. Inoltre, questo è il più vecchio dei tre, quindi penso che tu intenda duplicato da.
Rob Stevenson-Leggett

Risposte:


234

Rob, in realtà c'è un modo molto più semplice. Al posto del nome , usa Nome :

@Html.TextBoxFor(x => x.Data, new { Name = Model.Key + "_Data", id = Model.Key + "_Data" })

11
Con distinzione tra maiuscole e minuscole è @highwingers, questo piccolo dettaglio ha il potenziale per risparmiare ore.
anar khalilov

3
Overkill .. Nome ma ID X_X
Vladimirs

2
Strano, "id" non fa distinzione tra maiuscole e minuscole (funziona bene con Id e id) ma "name" no.
Vladimirs

10
Con ASP.NET 4, fornendo Namerisultati in due attributi Namee name, e lo strumento di associazione di modelli utilizza l'estensione name.
GSerg

1
Ma gestire due diverse proprietà i cui nomi differiscono solo per caso è una ricetta per un incubo di manutenzione .....
James McCormack


13

EditorFor ha un sovraccarico in cui puoi fornire l' nameattributo come parametro:

 @Html.EditorFor(expression, null, name)

1
Mi avrebbe risparmiato ore se l'avessi trovato ore fa, haha
Johnie Karr

Interessante, ma non c'è sovraccarico per l'attributo name per helper simili come DropDownListFor, devi specificarlo nel parametro degli attributi html (con la N maiuscola in Name).
nmit026

8

Prova EditorFor . puoi passare una stringa come nome del modello se vuoi assicurarti che la casella di testo venga visualizzata anche se il tipo di proprietà non è una stringa. Se la proprietà è già una stringa, non è necessario templatenameeseguire esplicitamente il rendering della casella di testo, quindi puoi passare null. Nota che non richiede esplicitamente il parametro id, lo dedurrà dal nome dell'elemento. E tutte le cose di convalida sono ancora attive con EditorFor

 @Html.EditorFor(x => x.Data, "string", Model.Key + "_Data")

7

la risposta di ben mi ha dato quello che stavo cercando tranne che devi avvolgere in Html.Raw

@Html.Raw(Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData"))

4

Si chiama Microsoft GOTCHA

Usa il nome in maiuscolo, in questo modo

@Html.TextBoxFor(m => m.Reply.Answer, new {@Name="Whatyouwant"})

3

un po '"poco carino" =), prova:

@Html.TextBoxFor(x => x.Data).ToString().Replace("Data", "NewData")

Sembra un bel modo semplice per farlo. Se un po 'hacky :-)
Rob Stevenson-Leggett

umm, in questo modo, non preferiresti prendere il normale Html.TexBox .. dal momento che qualsiasi digitazione statica è andata comunque dopo la sostituzione
sharp johnny

1

Per me funziona! Spero che ti aiuti!

@Html.EditorFor(model => model.Nome, new { htmlAttributes = new { @class = "form-control", @maxlength = "80", @id = "NomeFilter", @Name = "NomeFilter" } })

1
@Html.EditorFor(Model => Model.Something, "name", "name", new {@class = "form-control" })

Non sono sicuro di quale di questi due parametri di stringa nel mezzo faccia il lavoro, ma ha funzionato solo quando li ho digitati entrambi.


È ID e nome. questo ha funzionato per me. Ho esaminato tutte le risposte di cui sopra e nessuna di esse ha funzionato, ma questa 1. Grazie.
Orion

public static MvcHtmlString EditorFor<TModel, TValue>(this HtmlHelper<TModel> html, Expression<Func<TModel, TValue>> expression, string templateName, string htmlFieldName, object additionalViewData);. Non templateNameho idea di cosa dovrebbe essere, quindi ho usato null. Per htmlFieldNameho usato il nome del parametro (nel mio caso "ipmi" invece di "IPMI"). Questo ha funzionato per me.
BCdotWEB

0

Per questo esempio, disabilitavo i campi modulo in base alle autorizzazioni, ma li mostravo ancora. Avevo un campo nascosto per inviare il valore al controller, ma volevo un nome di campo diverso in EditorFor. Il primo parametro dopo il valore del modello rappresenta la proprietà "nome", il secondo è il nuovo nome.

@Html.EditorFor(m => m.UserName, "name", "UserNameDisabled", new { htmlAttributes = new { @class = "form-control", @disabled = "disabled"} });

Risultati in:

<input class="form-control text-box single-line" disabled="disabled" id="UserNameDisabled" name="UserNameDisabled" type="text" value="someEnteredValue" /> 

0

Mantienilo semplice, fornendo già l'ID dovresti semplicemente essere in grado di utilizzare il metodo "TextBox" invece di "TextBoxFor" e funzionerà bene lato client e lato server. Inoltre, sebbene la risposta accettata funzionerà ma produrrà attributi Nome duplicati sul tag se lo ispezioni utilizzando un browser. La soluzione seguente non presenta questo problema.

MvcHtmlString Html.TextBox (nome stringa, valore stringa, oggetto htmlAttributes)

@Html.TextBox(Model.Key + "_Data", Model.Key, new { id = Model.Key + "_Data" }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.