2014-05-09 11 views
5

Próbuję obcinać długi ciąg, aby wyświetlić go tylko na stronie indeksu. Jest on wyświetlany w następujący sposób:Jak można obciąć ciąg za pomocą pomocników HTML MVC?

Opis może składać się z 500 znaków, ale nie mogę pokazać tak dużo na tym układzie siatki. Chciałbym pokazać tylko pierwszych 25, ponieważ widzą to wszystko na stronie Szczegóły, ale nie mogę sprawić, żeby działał bez obcinania go na poziomie modelu.

Coś takiego byłoby miło:

@Html.DisplayFor(modelItem => item.Description.Take(25)) 
@Html.DisplayFor(modelItem => item.Description.Substring(0,25) 

EDIT

Dostaję następujący wyjątek w czasie wykonywania, gdy próbuję albo metodę.

Templates can be used only with field access, property access, single-dimension array index, or single-parameter custom indexer expressions. 
+0

Czy rozważałeś stworzenie dodatkowej właściwości modelu, która wykonuje podłańcuch i używa tego? –

+0

Tak, właśnie tak miałem zamiar to zrobić, jeśli nie było sposobu, aby pracować z szablonami i jedną własnością. –

+0

Twoim konkretnym problemem jest to, że wyrażenie przekazane do 'Html.DisplayFor' musi odwoływać się do rzeczywistej właściwości, a nie określonej wartości. Innymi słowy, możesz zrobić tylko '@ Html.DisplayFor (m => item.Description)', a nie '@ Html.DisplayFor (m => item.Description.Substring (0, 25))'. Nie musisz jednak używać 'Html.DisplayFor', więc możesz po prostu napisać' @ item.Description.Substring (0, 25) '. Należy jednak pamiętać o komentarzu @ 48klocs do odpowiedzi Nathana A. –

Odpowiedz

20

Nie używaj pomocnika html. Wystarczy to zrobić:

@item.Description.Substring(0, Math.Min(item.Description.Length, 25)); 

jestem zakładając, że jesteś w jakiejś pętli, gdzie item jest obecny pierwiastek.

+1

Spowoduje to wygenerowanie 'ArgumentOutOfRangeException', jeśli ciąg nie będzie dłuższy niż 25 znaków. – 48klocs

+0

@ 48klocs Naprawiono. –

+0

@NathanA, działa to świetnie, ale czy możesz podać opcję 2, aby pokazać kropki na końcu tego 'mydescription .....', próbowałem [this] (http://stackoverflow.com/questions/4610199/asp -net-mvc-substring-help) i daje błąd podczas analizy, czy masz jakiś pomysł? – stom

3

Można to zrobić za pomocą metody rozszerzenia.

public static string Truncate(this string source, int length) 
{ 
    if (source.Length > length) 
    { 
     source = source.Substring(0, length); 
    } 

    return source; 
} 

Następnie w widoku:

@item.Description.Truncate(25) 
+0

To nadal nie zadziała. DisplayFor przyjmuje tylko wyrażenia, które powodują wartość (konkretnie to, co jest wymienione w błędzie), a nie wywołania metod. To właśnie generuje błąd * Szablony *. –

+0

@NathanA prawdopodobnie masz rację. Nie sprawdziłem, co było wywołaniem 'DisplayFor' vs.' Display'. Myślę, że nazwany element 'Display' powinien działać, ale po prostu zgaduję. – 48klocs

+0

To wygląda lepiej. Dobra ogólna aplikacja. –

1

Można rozważyć utworzenie specjalnego własności wzór takich przypadkach, gdzie trzeba to:

public class MyModel 
{ 
    public string MyDescription {get; set;} 
    public string MyShortDescription { 
     get 
     { 
       return Truncate(MyDescription, 25); 
     } 
} 

private string Truncate(string, howMany) 
{ 
    // Code to perform the substring here 
} 

@Html.DisplayFor(modelItem => item.MyShortDescription); 
4

można też obciąć dane przed nim przechodzi do widoku lub użyj tej brzytwy:

@{ 
    var shortDescript = String.Concat(modelItem.Take(25)); 
} 
@Html.DisplayFor(modelItem => shortDescript) 
+0

Chociaż może to zadziałać, dlaczego w ogóle używałbyś 'DisplayFor'? Każda korzyść, którą można uzyskać, używając go do modelu danych, zostanie utracona, robiąc to w ten sposób. –

+0

Zakładając, że typ się nie zmienił (ciąg do ciągu), nadal można korzystać z tego samego szablonu wyświetlania. Zobacz http://stackoverflow.com/a/6365658/1445356 – arserbin3

0

Spróbuj przedłużenie

public static string TruncateMiddle(this string value, int lengthExpected, string separator = "...") 
    { 
     if (value.Length <= lengthExpected) return value; 

     decimal sepLen = separator.Length; 
     decimal charsToShow = lengthExpected - sepLen; 
     decimal frontChars = Math.Ceiling(charsToShow/2); 
     decimal backChars = Math.Floor(charsToShow/2); 

     return value.Substring(0, (int)frontChars) + separator + value.Substring(value.Length - (int)backChars);    
    } 

Korzystając

MyLongString.TruncateMiddle(50) 

Powrót coś takiego: Lorem ipsum dolor sit ame ... onsectetur Cras AMET.

Powiązane problemy