2009-05-29 25 views
1

与えられた役割に基づいて、データベースから検索してメニュー項目を返す構造を作った。コントローラからビューにHTMLを渡す

は今、私はコントローラで、このHTMLをレンダリングして表示するには、このHTMLを渡すための再帰的なメソッドを作成する必要があります。しかし、私はちょうどコントローラにネイティブHTMLを書く方法を知らない。 提案がありますか?

答えて

7

コントローラーはHTMLをまったく処理しないでください。これがMVCのビューです。コントローラはモデルからデータ構造を渡す必要があり、ビューはそのデータ構造をHTMLとしてレンダリングする必要があります。

2

コントローラでHTMLをレンダリングするためのMVC(またはあなたがやっていること)のアイデアではありません。ビューでHTMLを処理する必要があります。別のUI(Windowsアプリケーションなど)を提供する場合はどうなりますか? HTMLはWinAppにはあまり適していません。

2

HTMLヘルパーを使用してHTMLを作成できます。たとえば、Menuシステムは非常に複雑なので、HtmlHelper拡張を作成します。ここでは簡単なhtml拡張機能(TagBuildersを使用してHTMLをより簡単にしています。ネストされたタグがたくさんある場合は非常に便利です)。

public static String MyNewExtension(this HtmlHelper html, String extraVariable) 
    { 
     if (html == null) 
     { 
      throw new ArgumentNullException("html"); 
     } 

     TagBuilder h1Tag = newTagBuilder("h1"); 
     h1Tag.InnerHtml = extraVariable; 
     return h1Tag.ToString(); 
    } 
4

あなたが思っているより簡単:

コントローラー:

ViewData["html"] = @"<a href='http://www.stackoverflow.com'>Stack Overflow</a>"; 

ビュー:

<%= ViewData["html"] %> 

私はこれが最善の方法ではありません同意しません。私はあなたのビューでhtmlのマークアップを書いて、代わりにあなたのモデルの値を置き換えることをお勧めします。

コントローラー:

ViewData["Title"] = "Stack Overflow"; 
ViewData["Url"] = @"http://www.stackoverflow.com"; 

ビュー:

<a href="<%=Html.Encode(ViewData["Url"])%>"> 
    <%=Html.Encode(ViewData["Title"])%></a> 

あなたは多くを作成する必要がある場合、あなたは一般的なマークアップをカプセル化する部分ビュー/ユーザーコントロールを使用することができます。

関連する問題