2009-10-23 6 views
0

i une instruction de boucle dans ma page d'accueil pour les nouvelles ..pour les sorties des états de boucle qui relie à differnent contrôleurs en asp.net mvc

Je ces codes ..

Modèle:

Imports Microsoft.VisualBasic 
Imports System.Data 

Public Class ClassNewsConnection 

    Inherits ClassConnection 

    'Featured News for Home Page 

    Public Function NewsFeatureHome() As DataTable 
     Return ReadData("SELECT * FROM news WHERE newsFeature = '" & 1 & "' ORDER BY newsID DESC LIMIT 3 ") 
    End Function 


End Class 

Controller:

Public Class HomeController 
    Inherits Global.System.Web.Mvc.Controller 
    Private News As New ClassNewsConnection 
    Private Announcement As New ClassAnnouncementConnection 
    Private Process As New ClassHTML 

Function Index() As ActionResult 
     Dim dNews As DataTable = News.NewsFeatureHome() 

     For dCount As Integer = 0 To dNews.Rows.Count - 1 
      dNews.Rows(dCount).Item("newsTitle") = Process.ToHTML(dNews.Rows(dCount).Item("newsTitle")) 
      dNews.Rows(dCount).Item("newsContent") = Process.ToHTML(dNews.Rows(dCount).Item("newsContent")) 
     Next 
     Return View(dData) 
    End Function 

End Class 

Vue:

<%@ Page Title="" Language="VB" MasterPageFile="~/Views/Shared/SiteMasterPage.Master" Inherits="System.Web.Mvc.ViewPage" %> 
<%@ Import Namespace="System.Data" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Home 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

    <h2>Index</h2> 

    <div> 

     <label for="News">News</label> 
     <%Dim dNews As DataTable = ViewData.Model%> 
     <%Dim id As Integer%> 
     <%Dim dTitle As String%> 

     <%For dCount As Integer = 0 To dNews.Rows.Count - 1%> 
     <%Dim dContent As String = dNews.Rows(dCount).Item("newsContent")%> 
     <%id = dNews.Rows(dCount).Item("newsID")%> 

     <p> 
     <%dTitle = dNews.Rows(dCount).Item("newsTitle")%> 
     <%=Html.ActionLink(dTitle, "__________", New With {id}, DBNull.Value)%> 
     <img src='<%=Url.Content("~/NewsImages/" + dNews.Rows(dCount).Item("newsThumbnail")) %>' alt="" /> 

     <%If dContent.Length > 100 Then%> 
      <%dContent = dContent.Substring(0, dContent.IndexOf("", 300)) & "..."%> 
     <%Else%> 
      <%dContent = dContent%> 
     <%End If%> 

     <%=Html.ActionLink("Read More", "__________", New With {id}, DBNull.Value)%> 
     </p> 

     <%Next%> 
    </div> 

</asp:Content> 

la pour les sorties des états de boucle différentes nouvelles de différents contrôleurs et vues .. exemple, la première sortie pourrait rendre cette page: la production communautaire/CommunautéInfos/7 la seconde pourrait rendre cette page: Athlétisme/AthleticsNews/5 la troisième sortie pourrait rendre cette page: Programmes/ProgramsNews/2

comment devrais-je faire le code pour le lien vers ces pages? vais-je utiliser javascript? Le problème est, je ne suis pas si familier avec javascript :( aide s'il vous plaît .. merci! merci!

Répondre

1

Vous devriez être en mesure de générer le deuxième argument en faveur de la ActionLink méthode, basée sur un champ de type de nouvelles ou similaire dans votre table. ex

<% 
Dim newsType As String = dNews.Rows(dCount).Item("newsType") 

Dim controllerName As String 
Dim actionName as String 

' I'm guessing you have a field similar to this: 
If (newsType = "Com. News") then 
    controllerName = "Community" 
    actionName = "CommunityNews" 
End If 

If (newsType = "Ath. News") then 
    controllerName = "Athletics" 
    actionName = "AthleticsNews" 
End If 
%> 

<%=Html.ActionLink(dTitle, actionName, controllerName, New With {Id = id})%> 

Cela devrait faire l'affaire, mais je commence à craindre que il commence à être trop beaucoup de code dans la vue. Il pourrait ne pas soit une bonne idée d'utiliser DataTables en tant que modèle, mais cela pourrait prendre beaucoup de temps pour changer cela à ce stade:

Vous pouvez créer une méthode d'aide qui retournera le contrôleur et l'action pour un certain type de nouvelles, ou mieux encore, générer un lien donné le type de nouvelles. Vous pouvez le faire en créant une classe avec des méthodes d'extension pour la classe HtmlHelper. Cette méthode ressemblerait à ceci:

<Extension()> _ 
Public Sub NewsLink(ByVal htmlHelper As HtmlHelper, newsType as string, linkText As String, id As int) 

    Dim action As String 
    Dim controller As String 

    'todo: logic to get action and controller names from news type 

    return htmlHelper.ActionLink(linkText, action, controller, New With {Id = id}) 
End Sub 

Bonne chance. Je pense qu'il y a moins de gens qui utilisent VB.NET que C# avec MVC.

+0

Je suis d'accord que les décisions concernant le nom du contrôleur et le nom de l'action à utiliser, pour chaque lien, ne doivent pas figurer dans la vue. Définissez une structure de données qui contient ces deux informations, ainsi que tout ce qui est pertinent pour chaque lien (comme une description, un identifiant unique, etc.) et créez une liste de celles-ci dans le contrôleur. Cela simplifie alors la vue à une boucle qui traverse la liste et construit les liens d'action appropriés. – belugabob

0

Je suppose que cette partie de votre code d'affichage est l'endroit où vous avez un problème? Le DBNull.Value semble vraiment étrange. Vouliez-vous dire Null?

Quoi qu'il en soit, vous devriez être en mesure d'utiliser une surcharge comme ceci:

Html.ActionLink(dTitle, "CommunityNews", "Community", New With {id}, Null) 

Ne pas utiliser JavaScript pour cela.

Questions connexes