asp.net mvcの異なるコントローラーにリンクするforループステートメント出力
-
05-07-2019 - |
質問
iホームページにニュースのループ文があります。
これらのコードがあります。
モデル:
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
コントローラー:
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
表示:
<%@ 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>
forループステートメントは、異なるコントローラーとビューから異なるニュースを出力します。 例、 最初の出力はこのページをレンダリングできます:Community / CommunityNews / 7 2番目の出力はこのページをレンダリングできます:Athletics / AthleticsNews / 5 3番目の出力はこのページをレンダリングできます:Programs / ProgramsNews / 2
これらのページへのリンクのコードを作成するにはどうすればよいですか? 私はjavascriptを使用しますか?問題は、私はjavascriptにそれほど精通していない:( 助けてください.. ありがとうございました! ありがとう!
解決
ニュースタイプフィールドまたはテーブル内の同様のフィールドに基づいて、ActionLinkメソッドの2番目の引数を生成できるはずです。例:
<%
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})%>
これでうまくいくはずですが、ビューにコードが多くなりすぎるのではないかと心配し始めます。モデルとしてDataTablesを渡すのは得策ではないかもしれませんが、この時点でそれを変更するには多くの作業が必要になる場合があります。
特定のニュースタイプのコントローラーとアクションを返すヘルパーメソッドを作成できます。また、ニュースタイプに応じてリンクを生成することもできます。これを行うには、HtmlHelperクラスの拡張メソッドを使用してクラスを作成します。その方法は次のようになります。
<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
頑張って。 MVCでC#よりもVB.NETを使用している人は少ないと思います。
他のヒント
ビューコードのこの部分に問題があると思いますか?
Html.ActionLink(dTitle, "__________", New With {id}, DBNull.Value)
DBNull.Value
は本当に奇妙に見えます。 Null
という意味ですか?
とにかく、次のようなオーバーロードを使用できるはずです:
Html.ActionLink(dTitle, "CommunityNews", "Community", New With {id}, Null)
これにはJavaScriptを使用しないでください。