2011-07-19 20 views
20

私はAsp.NetにMVC 3に移植しようとしているWebサイトを持っています。以前はMVC 2でしか作業していませんでした。私は、次のASP機能多分これは、forループと同様に動作しますように見えるmvc 3は<asp:repeater>関数に相当しますか?

<div class="popup-holder"> 
<ul class="popups"> 
    <asp:Repeater runat="server" ID="ourTeamRepeater" OnItemDataBound="ourTeamRepeater_ItemDataBound"> 
     <ItemTemplate> 
      <asp:Panel ID="pnlTeamMember" runat="server"> 
       <li id="TeamMember" runat="server" class="memberImage"> 
        <asp:Image runat="server" ID="memberImg" /> 
       </li> 
       <div class="popup"> 
        <div class="img-holder"> 
         <asp:Image runat="server" ID="memberImgBig" /> 
        </div> 
        <div class="popup-text-t"> 
         <div class="close"> 
          close 
         </div> 
        </div> 
        <div class="popup-text"> 
        </div> 
        <div class="popup-text-b"> 
        </div> 
        <div class="holder"> 
         <asp:Literal ID="memberDescription" runat="server" /> 
        </div> 
       </div> 
      </asp:Panel> 
     </ItemTemplate> 
    </asp:Repeater> 
</ul> 

に出くわし、私はMVC 3のアーキテクチャに変換するかどうかは非常に肯定的ではありませんよ。

答えて

15

あなたは、ASPのMVCと同等と仮定することは非常に正しい:Repeaterが

<% foreach(var item in Model) 
    { %> 
     <!-- Your HTML Markup --> 
<% } %> 
6

あなたはそれがforループに似たことについて正しいです。単純な実装は次のようになります。

<div class="popup-holder"> 
<ul class="popups"> 
    <%foreach(var item in Model.Items) { %> 
      <div id="pnlTeamMember"> 
       <img src="<%: item.MemberImageSrc %>" ID="memberImg" /> 
       <div class="popup"> 
        <div class="img-holder"> 
         <img src="<%: item.MemberImgBigSrc %>" ID="memberImgBig" /> 
        </div> 
        <div class="popup-text-t"> 
         <div class="close"> 
          close 
         </div> 
        </div> 
        <div class="popup-text"> 
        </div> 
        <div class="popup-text-b"> 
        </div> 
        <div class="holder"> 
         <%: item.MemberDescription %> 
        </div> 
       </div> 
      </div> 
    <% } %> 
</ul> 

あなたはどのコントロールがrunat="server"と、もはや存在しない、また、コードビハインドでのハンドラにリンクされているすべてのイベントがあることがわかります。代わりに、コントローラーが表示する必要があるデータを表すオブジェクトでModelオブジェクトを設定していると仮定しています。これは、MVCを使用する場合のコントローラの役割です。

+0

あなたは()の代わりにforeach()を使用しました。私は確信しています;-) –

+0

@Steve:Ha!そうでした! – StriplingWarrior

2

リピータは、ループしているコレクション内のアイテムにアクセスできるようにデータバインディングを提供する単なるループです。 ourTeamRepeater_ItemDataBoundメソッドを見ると、データバインドされたアイテムを使用してアイテムテンプレートの要素にデータを埋め込むコードが見つかります。

通常、MVCでループを使用して項目をループすることができます。foreach例:

<% foreach (var item in items) { %> 
    <div class="holder"> 
    <%= item.Description %> 
    </div> 
<% } %> 
+1

リピーターには余分なキャンディーがありますが、お手数ですが –

37

約盲目的にいくつかのWebフォームは、あなたが持っているコードを表示する行ずつ翻訳されていないだけでASP.NET MVCに既存のWebフォームアプリケーションを移植。ターゲットプラットフォームのセマンティクスを考慮する必要があります。たとえば、これをasp:Repeaterに変えて、ビューモデルのようなものを考慮するのではなく、醜いforeachループに変換すると、表示テンプレートはあまり良くありません。

だから、ASP.NET MVCには、ビューモデルを設計することにより起動します。

public class MemberViewModel 
{ 
    public int Id { get; set; } 
    public string Description { get; set; } 
} 

、あなたは、このビューモデルを移入コントローラのアクションを設計:

public ActionResult Index() 
{ 
    IEnumerable<MemberViewModel> model = ... 
    return View(model); 
} 

あなたは強く型付けされたビューを作成します表示テンプレートを呼び出します。

@model IEnumerable<MemberViewModel> 
@Html.DisplayForModel() 

を定義してから、ディスプレイを定義します

@model MemberViewModel 

<li id="TeamMember" class="memberImage"> 
    <img src="Url.Action("ThumbnailImage", new { id = Model.Id })" alt=""/> 
</li> 

<div class="popup"> 
    <div class="img-holder"> 
     <img src="Url.Action("FullImage", new { id = Model.Id })" alt=""/> 
    </div> 

    <div class="popup-text-t"> 
     <div class="close"> 
      close 
     </div> 
    </div> 

    <div class="popup-text"></div> 
    <div class="popup-text-b"></div> 

    <div class="holder"> 
     @Html.DisplayFor(x => x.Description) 
    </div> 
</div> 

今、あなたは私たちが、会員ID与えられたメンバーの画像を取得することができます二つの追加ThumbnailImageFullImageコントローラのアクションに気づくでしょう:コレクション(~/Views/Shared/DisplayTemplates/MemberViewModel.cshtml)の各要素に対してレンダリングされますmplate。例:

public ActionResult ThumbnailImage(int id) 
{ 
    byte[] thumbnail = ... 
    return File(thumbnail, "image/jpeg"); 
} 

これはASP.NET MVCとよく似ています。ご覧のとおり、従来のWebFormsとはまったく異なるパターンです。

+0

Newby MVC質問 - 上記のコードで '〜/ Views/Shared/DisplayTemplates/MemberViewModel.cshtml'はどこでレンダリングされますか? – Chalky

+0

もう1つの初心者質問 - このコードではどこにページングがありますか? DisplayForModel()はどのようにそれを提供しますか? 1ページにレコード数を設定するには? – user1709408

関連する問題