Jak ustawić wartość domyślną za pomocą Html.TextBoxFor?

198

Proste pytanie: jeśli używasz Pomocnika HTML z ASP.NET MVC Framework 1, łatwo jest ustawić domyślną wartość w polu tekstowym, ponieważ występuje przeciążenie Html.TextBox(string name, object value). Kiedy próbowałem użyć metody Html.TextBoxFor , moje pierwsze podejrzenie polegało na wypróbowaniu następujących, które nie działały:

<%: Html.TextBoxFor(x => x.Age, new { value = "0"}) %>

Czy powinienem na razie trzymać się Html.TextBox (ciąg, obiekt)?

d skompilowany
źródło
użyj tego <%: Html.TextBoxFor (x => x.Age, new {Value = "0"})%>, wprowadź niewielką zmianę wartości V kapitału.
Mohan Singh

Odpowiedzi:

354

możesz tego spróbować

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>
Tassadaque
źródło
49
Ciekawe, dlaczego działa litera „V”, a małe litery „v” nie? Ponadto to rozwiązanie zastępuje wartość modelu dla wieku, nawet jeśli takie istnieje.
Derek Hunziker,
74
wartość z małym v jest słowem kluczowym dla C # msdn.microsoft.com/en-us/library/x9fsa0sw.aspx . Myślę więc, że dlatego to nie działa.
Tassadaque,
3
Głosował za komentarzem, ponieważ jeden głos za odpowiedzią tak niejasną i wnikliwą wydawał się ... nieodpowiedni.
ehdv
9
Nadal ciekawe jest, że @value nie działa. readonly jest również słowem kluczowym dla C #, ale @readonly działa bez żadnych problemów.
Diego
16
Źródłem HTML w przeglądarce jest <wartość wejściowa = „0” id = „Wiek” nazwa = „Wiek” typ = „tekst” wartość = „” /> przy użyciu @Value. W tagu wejściowym znajdują się zarówno „Wartość” z „0”, jak i „wartość” z „”.
Ricky,
59

To powinno działać dla MVC3 i MVC4

 @Html.TextBoxFor(m => m.Age, new { @Value = "12" }) 

Jeśli chcesz, aby było to ukryte pole

 @Html.TextBoxFor(m => m.Age, new { @Value = "12",@type="hidden" }) 
Gokul
źródło
21
W przypadku ukrytych pól wystarczy użyć @ Html.HiddenFor (m => m.Age, new {@Value = "12"})
Buginator
dobry @ Html.HiddenFor (m => m.Age, new {@Value = "12"}) nie pracuje
RollerCosta
I dlaczego miałbyś ukrywać taką zakodowaną wartość domyślną jak ta? bez sensu
Antoine Pelletier
31

Okazuje się, że jeśli nie określisz metody Model w widoku w kontrolerze, nie utworzy ona dla ciebie obiektu z wartościami domyślnymi.

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Create()
{
  // Loads default values
  Instructor i = new Instructor();
  return View("Create", i);
}

[AcceptVerbs(HttpVerbs.Get)]
public ViewResult Create()
{
  // Does not load default values from instructor
  return View("Create");
}
d skompilowany
źródło
Bardziej prawdopodobne jest, że jest to błąd lub funkcja MVC, ponieważ Html.PasswordFor (m => m.Password, new {class = "form-control", value = "default" jest renderowany w prawie ten sam HTML, a "default" przechodzi aby wartość była wyświetlana pomyślnie. Na przykład wartość = Model.Email działa, ale wartość = ViewBag.Email działa. Więc ta zaakceptowana odpowiedź jest lepsza i czystsza, nie tak hakerska.
ZZZ

Co to jest Instructor?
Csaba Toth

20

Wartość domyślna będzie wartością twojej Model.Agenieruchomości. To w pewnym sensie cała sprawa.


3
Wydaje się, że to zły pomysł, gdy model zarządza wartościami domyślnymi. Co należy zrobić, gdy potrzebna jest inna wartość domyślna dla tej samej kolekcji elementów modelu?
RredCat

@RredCat Zgadza się, że to zaburza separację warstwy interfejsu użytkownika
Evan M

18

Możesz po prostu zrobić:

<%= Html.TextBoxFor(x => x.Age, new { @Value = "0"}) %>

lub lepiej, spowoduje to przełączenie na wartość domyślną „0”, jeśli model ma wartość null, na przykład jeśli masz ten sam widok do edycji i tworzenia:

@Html.TextBoxFor(x => x.Age, new { @Value = (Model==null) ? "0" : Model.Age.ToString() })

11

wartość = „0” ustawi wartość domyślną dla @ Html.TextBoxfor

rozróżniana wielkość liter „v” powinna być wielka

Poniżej działa przykład:

@Html.TextBoxFor(m => m.Nights, 
    new { @min = "1", @max = "10", @type = "number", @id = "Nights", @name = "Nights", Value = "1" })

9

Oto jak to rozwiązałem. Działa to, jeśli używasz tego również do edycji.

@Html.TextBoxFor(m => m.Age, new { Value = Model.Age.ToString() ?? "0" })

jeśli wiek jest zerowy .. otrzymasz wyjątek wskaźnika zerowego, ponieważ ?? podejmie próbę sprawdzenia zwrotu ToString ().
eaglei22

@ eaglei22 Nullable <T> .ToString () zwróci pusty ciąg, jeśli wartość jest null.
Tom Lint

dziękuję za pokazanie, jak modelować wiązanie w anonimowym obiekcie
nie ma

9

To praca dla mnie

@Html.TextBoxFor(model => model.Age, htmlAttributes: new { @Value = "" })

+1 za nazwany parametr, który jest szczególnie pomocny w kodzie kopiowania / pastowalnym i który wykorzystuje metodę z wieloma przeciążeniami
Ekus 10.04.19

8

Używanie @Valueto hack, ponieważ generuje dwa atrybuty, np .:

<input type="..." Value="foo" value=""/>

Zamiast tego powinieneś to zrobić:

@Html.TextBox(Html.NameFor(p => p.FirstName).ToString(), "foo")

7

to działało dla mnie, w ten sposób ustawiamy wartość domyślną na pusty ciąg

@Html.TextBoxFor(m => m.Id, new { @Value = "" })

2
Chociaż ten kod może odpowiedzieć na pytanie, lepiej byłoby dołączyć kontekst, wyjaśniając, jak to działa i kiedy go używać. Odpowiedzi zawierające tylko kod nie są przydatne na dłuższą metę.
Bono

@Bono dodał kilka komentarzy
eric_eri

5

Jeśli masz częściowy formularz strony zarówno do edycji, jak i dodawania, wówczas sztuczką, której używam do wartości domyślnej, 0jest wykonanie następujących czynności:

@Html.TextBox("Age", Model.Age ?? 0)

W ten sposób będzie to 0ustawione, jeśli jest rozbrojone lub faktyczny wiek, jeśli istnieje.


1
Jeśli Age jest int, to nie zadziała; Musiałby to być zerowy int.
Justin Self

0

Spróbuj również, to znaczy usuń nowy {} i zastąp go ciągiem.

<%: Html.TextBoxFor(x => x.Age,"0") %>
Hammad Khan