2010-06-17 10 views
21

Jestem początkujący w ASP.NET MVC, i mam wątpliwości:Client Id do posesji (ASP.Net MVC)

Próbuję zrobić etykietę dla TextBox w moim przekonaniu i I „chciałbym wiedzieć, w jaki sposób można wziąć identyfikator, który będzie renderowania w klienta do generete skrypty ... na przykład:

<label for="<%=x.Name.ClientId%>"> Name: </label> 
<%=Html.TextBoxFor(x=>x.Name) %> 

Co trzeba umieścić w«ClientID», aby upewnić się, że prawidłowy identyfikator będzie renderować do odpowiedniej kontrolki?

Dzięki

Cheers

Odpowiedz

38

Umieść ten kod gdzieś:

using System; 
using System.Linq.Expressions; 
using System.Web.Mvc; 

namespace MvcLibrary.Extensions 
{ 
    public static class HtmlExtensions 
    { 
     public static MvcHtmlString FieldIdFor<TModel, TValue>(this HtmlHelper<TModel> html, 
      Expression<Func<TModel, TValue>> expression) 
     { 
      string htmlFieldName = ExpressionHelper.GetExpressionText(expression); 
      string inputFieldId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName); 
      return MvcHtmlString.Create(inputFieldId); 
     } 
    } 
} 

Następnie w widoku ASPX:

<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label> 
<%= Html.TextBoxFor(m => m.EmailAddress) %> 

Można również użyć w JavaScript wywołuje jako nie będziesz znać identyfikatora kontrolki z wyprzedzeniem i może go potrzebować, aby kod JavaScript działał przeciwko niemu:

<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script> 

Metoda helperów LabelFor HTML, o której tu wspomniano, nie pozwala określić rzeczywistej etykiety tekstowej, której chcesz użyć, musisz udekorować swoje ViewModels atrybutami, aby ustawić tekst etykiety, a IMHO jest brzydkie. Wolę, aby te rzeczy pojawiały się w samej części widoku ASPX, a nie w niektórych modelach domen/widoków. Niektórzy jednak nie zgadzają się ze mną.

Nie pewny zasad delegowania linki do swoich blogach, ale pisał bloga na dokładnie tym temacie: http://www.dominicpettifer.co.uk/Blog/37/strongly-typed--label--elements-in-asp-net-mvc-2

+0

Wiem, ale niektórzy ludzie nie rozumieją poprawnie (mój angielski nie jest zbyt dobry)! To wszystko, czego potrzebuję ... Wielkie dzięki! Udekoruj klasy modelu domeny za pomocą atrybutów nie jest dla mnie dobrą rzeczą, zgadzam się z tobą! –

+6

To powinno być częścią struktury. – pbz

+0

Nie * całkiem * działa w ramach kontroli użytkownika (tj. .ascx) –

-2

użyć następujących:

Model.Name 

Można po prostu zrobić „pokaż źródło” lub zbadać renderowany tekstowe z czymś Firebug, aby zobaczyć, jakie metody Html.xyzFor() są generowanie. Zwykle generują pole tekstowe z atrybutami "id" i "name", które są ustawione na nazwę właściwości.

+0

będzie to napisać treść nieruchomości, a ja nie potrzebuję .. muszę nazwa obiektu (lub identyfikatora klienta, jeśli istnieje ... jeden ... nie wiem dobrze) –

+0

@FelipeOriani @womp podczas używania 'Html.LabelFor (x => x.Id)' pokazuje mi tekst "Id", który zdefiniowałem 'DisplayName' of Id zamiast Wartość id, która pochodzi z DB. Wszelkie komentarze? – Steve

0

Jak już powiedziano, nie musisz się martwić o ClientID, UniqueID itp. W ASP.NET MVC, ponieważ są to abstrakcje formularzy. Możesz po prostu napisać ID, który chcesz. Istnieje również metoda rozszerzenie na to:

<%= Html.LabelFor(x => x.Name) %> 
+1

LabelFor da ci mocno wpisaną

27

MVC 4 ma ten zbudowany teraz .. zobacz this

+1

To miły koleś! Dzięki ;) –

5

jego zabawy co można znaleźć w darmowym kodzie źródłowym MVC. Oto odpowiedź:

@ Html.IdFor lub @ Html.NameFor

Więc jaka jest różnica? Oto haczyk:

NazwaNie zastąpił żadnego "." do "_".

Jeśli chcesz żadnego przykładu, I have found this cool small article