2014-02-18 7 views
5

Ich versuche, ein Textfeld zu kürzen, die manchmal extrem groß ist oder zu anderen Zeiten ist es null aus der Datenbank d.hNeed Razor HTML DisplayFor Helper

@Html.DisplayFor(modelItem => item.MainBiography) 

und ersetzt mit drei Punkten am Ende abschneiden.

Ich habe die Teilzeichenfolge-Funktion versucht, aber immer Fehler erhalten.

Alle Zeiger, danke!

Update:

Das ... ist nicht enorm wichtig, so habe ich versucht,

@Html.DisplayFor(modelItem => item.MainBiography.Substring(0,10)) 

und erhalten die folgenden Fehlercodes:

System.InvalidOperationException durch Benutzercode nicht behandelte war HResult = -2146233079 Message = Vorlagen können nur mit Feldzugriff, Eigenschaftenzugriff, eindimensionalem Array-Index oder benutzerdefinierten benutzerdefinierten Indexerausdrücken verwendet werden. Source = System.Web.Mvc -

+2

Zeigen Sie uns den Code ... Welche Fehler bekommen Sie? –

+0

System.InvalidOperationException wurde von Benutzercode nicht behandelt. HResult = -2146233079 Message = Vorlagen können nur mit Feldzugriff, Eigenschaftenzugriff, eindimensionalen Array-Index oder benutzerdefinierten benutzerdefinierten Indexerausdrücken verwendet werden. Source = System.Web.Mvc –

Antwort

7

Du bist besser dran, eine andere Eigenschaft im Modell zu schaffen, das MainBiography zu holen und sie schließlich kurz geschnitten.

So:

// This is your property (sampled) 
public string MainBiography { get; set; } 

//How long do you want your property to be at most ? 
//(Best practice advices against magic numbers) 
private int MainBiographyLimit = 100; 

//You probably need this if you want to use .LabelFor() 
//and let this property mimic the "full" one 
[Display(Name="Main Biography")] 
public string MainBiographyTrimmed 
{ 
    get 
    { 
     if (this.MainBiography.Length > this.MainBiographyLimit) 
      return this.MainBiography.Substring(0, this.MainBiographyLimit) + "..."; 
     else 
      return this.MainBiography; 
    } 
} 

Nutzungs

@Html.DisplayFor(item => item.MainBiographyTrimmed) 

Ein weiterer Ansatz ein vollwertiges View-Modell wäre, wäre zu bauen, aber ich finde es viel des Guten mehr als oft nicht.

+0

Funktioniert ein Vergnügen vielen Dank! –

+0

Ich habe einen Fehler im Helper erhalten - Eine lokale Variable namens 'item' kann nicht in diesem Bereich deklariert werden, da sie 'item' eine andere Bedeutung geben würde, die bereits in einem übergeordneten oder aktuellen Bereich verwendet wird Also habe ich @ Html.DisplayFor (modelItem => item.SpecialistInteresTrimmed) und es ist in Ordnung. –

+0

@ Html.DisplayFor (modelItem => item.MainBiographyTrimmed) –

0

Versuchen Html.Display statt DisplayFor wie folgt aus:

@Html.Display(item.MainBiography.Substring(0, 10), null, "MainBiography") 

Durch die Art und Weise Ihr beide Lambda-Aussagen invalid.Parameter Namen sind gleich sein sollten.

Nicht so:

@Html.DisplayFor(modelItem => item.MainBiography) 

Es sollte:

@Html.DisplayFor(modelItem => modelItem.MainBiography) 

Oder:

@Html.DisplayFor(item => item.MainBiography) 
+0

Wenn dies in einem verschachtelten Typ ist, verliert er seine HTML-Feldnamen (Präfixe) mit 'Display'. –

1

DisplayFor benötigt einen Ausdruck, eine Eigenschaft darstellt.

Sie eine Eigenschaft zum Modell hinzufügen:

public string MainBiographyTrimmed 
{ 
    get 
    { 
     if (MainBiography.Length) > 10 
      return MainBiography.Substring(0, 10) + "..."; 
    } 
} 

dann Ihrer Meinung nach gerade tun:

@Html.DisplayFor(item => item.MainBiographyTrimmed) 
1

Sie können eine String-Erweiterungsmethode schreiben und diese Eigenschaft auf Ihrem Modell nennen (von Zeichenkettentyp). Sie können das Limit für Ihre Teilstringoperation übergeben.

Importieren Sie in Ihrer Ansicht den Namespace, in dem Sie Ihre Erweiterungsmethode haben, und rufen Sie die Methode für Ihre Zeichenfolgeneigenschaft auf.

@Html.DisplayFor(modelItem => item.MainBiography.SubStringTo(10))