2010-08-13 6 views
1

J'aimerais avoir une liste qui raccourcira une valeur de champ si elle est trop longue à partir d'un Entity Data Model lié. Quelque chose où je pouvais prendre les éléments suivants:Ajouter un champ calculé au modèle mvc asp.net

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcDR.Models.DONOR_LIST>>" %> 
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server"> 
    <h2>Lists</h2> 
    <table> 
     <tr> 
      <th></th> 
      <th>LIST_NAME</th> 
      <th>SUMMARY</th> 
     </tr> 
    <% foreach (var item in Model) { %> 
     <tr> 
     <td><%: Html.ActionLink("Details", "Society", new { id = item.DONOR_LIST_ID })%> |</td> 
     <td><%: item.LIST_NAME %></td> 
     <td><%: item.SUMMARY%></td> 
    </tr> 
<% } %> 

</table> 

et remplacer

 <td><%: item.SUMMARY%></td> 

avec

 <td><%: item.SHORT_SUMMARY%></td> 

faire dans Ruby est assez simple, mais je ne suis pas sûr de la façon de le faire travailler dans le modèle de données Entity de asp.net mvc.

+0

Voulez-vous dire afficher une version plus courte (ou couper du texte avec quelques points ...) du résumé si le résumé c'est à dire est plus grand que 15 0 caractère? –

+0

http://stackoverflow.com/questions/271398/what-are-your-favorite-extension-methods-for-c-codeplex-com-extensionoverflow/1512463#1512463 – Omar

Répondre

0

Vous pouvez aussi le faire avec une méthode d'extension. Je tape ce à partir de zéro, sans bénéficier d'un IDE, donc s'il vous plaît excuser les fautes de frappe:

public static class Extensions 
{ 
    public static string Shorten(this string str, int maxLen) 
    { 
     if(str.Length > maxLen) 
     { 
      return string.Format("{0}...", str.Substring(0, maxlen)); 
     } 

     return str; 
    } 
} 

Puis dans votre code asp.net:

<td><%: item.SUMMARY.Shorten(100) %></td> 
+0

Ohhh, j'aime beaucoup ça. Une question, quelle est la meilleure pratique, ou convention acceptée de l'endroit où mettre cette méthode d'extension dans le projet? – Lloyd

+0

Je vais dans les deux sens en prenant ceci comme réponse, @server_info a eu la belle addition de l'espace de noms. Pour suivre mes questions, j'ai créé un dossier appelé "Helper". J'ai également vérifié null et retourné null pour permettre cela. Ensuite, sur la page d'affichage, vous avez ajouté <% @ Import Namespace = "Helpers"%> dans la section Déclaration de la page. – Lloyd

+0

C'est la façon de le faire. :) – Robaticus

0

Est-ce que quelque chose comme ça va fonctionner?

namespace MvcDR.Models 
{ 
    public partial class DONOR_LIST 
    { 
     public string SHORT_SUMMARY 
     { 
     get 
     { 
      int desiredMaxStringLength = 100; 
      return SUMMARY.Substring(0, desiredMaxStringLength) + "..."; 
     } 
     } 
    } 
} 
1

Je suis habituellement résolu ce problème dans le passé en créant une classe ViewModel qui représente une version spécifique à la vue d'une classe de modèle EF. Vous pouvez utiliser quelque chose comme AutoMapper pour vous aider à faire le «travail de grognement» du mappage de champ un-à-un, mais ensuite ajouter un champ SHORT_SUMMARY calculé.

Vous changez alors votre vue d'utiliser le modèle de vue:

Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcDR.Models.DONOR_LIST_VIEW>>" 
+0

Je suis un grand fan de l'approche ViewModel avec MVC. Nous avons une application que nous avons démarrée avec une approche MVC traditionnelle, puis nous avons adopté ViewModels. Les choses se sont beaucoup simplifiées pour la maintenance avec ViewModels. – Robaticus

+0

Je fais comme ça. Je pense que je vais commencer à ajouter plus de ViewModels dans mon projet. – Lloyd

1

Je voudrais faire une méthode d'extension pour chaîne qui raccourcit le texte ... Ensuite, vous pouvez le réutiliser sur un champ ...

namespace Helpers 
{ 
    public static class StringExtensions 
    { 
     public static string ShortenMyString(this string s, int length) 
     { 

      // add logic to shorten the string.... 
     } 
    } 
+0

ressemble un peu à la mienne :) – Robaticus

Questions connexes