2009-03-11 17 views
5

Bir kategorinin bir listesini bir ASP.NET MVC çerçevesinin en son sürümünde bir MasterPageView bir gezinti çubuğuna getirmek için yapmaya çalışmak biraz kafam karıştı. Şimdiye kadar kısmi kısmi tecrübem var (bu karışıklığa katkıda bulunuyor).ASP.NET MVC - MasterPageView ve RenderPartials - Confusion

Bu RenderPartial varyantını kullanmalı mıyım?

HtmlHelper.RenderPartial(string partialViewName, object model) 

Bu yöntemin iyi örneklerini bulamadık. Sözleşmeyle, MasterPageView ile ilişkili bir model yok mu? Öyleyse, MasterPageView'den "kısmi" bir veriyi itmek veya çekmek için uygun yol nedir?

bu yöntem kesinlikle yanlış yolda gidiyor varsayarsak:

<div id="navigation"> 
     <% 
      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 
      Html.RenderPartial("NavBar", lst); 
     %> 
    </div> 

cevap

0

yerine) Html.RenderAction (kullanmak ve ondan kısmi bir görünüm döndürecektir.

+0

nereden RenderAction() yöntemini alabilirim? Bu bir Contrib şey mi? – BuddyJoe

+0

CodePlex'te MVC Futures'ta olabilir. Elimi hatırlamıyorum (şu anda kontrol edebileceğim yere yakın değil) –

1
public ActionResult NavBar() 
{ 

      CategoryRepository cr = new CategoryRepository(); 
      IList<Category> lst = cr.GetCategories(); 


      return View(lst); 
} 
Kısmi çağrı

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> 
<%@ Import Namespace="app.Models" %> 

üzerinde

ve burada tüm render ui

<div id="navigation"> 
     <% 
      Html.RenderPartial("NavBar"); 
     %> 
    </div> 

Eğer ActionResult sizin denetleyicileri çağrıları yapabilir yapmak

+0

Denetleyicilerimin her birinde bu NavBar() çağrısını yapmalı mıyım? ya da içinde miras kalsın ... bu doğru görünmüyor. – BuddyJoe

+0

Yaptığım şey, Denetleyiciyi devralan ve tüm yeniden kullanılabilir kısmi kod çağrılarımı temel denetleyiciye koyan ve tüm denetleyicileri BaseController'ı devralan BaseController'ı oluşturmak. Bu şekilde tüm denetleyicilerin bu kısmi erişime sahip olması. – Ayo

+0

Hayır, zorunda değilsiniz. Sadece navigasyon kodunuzu @ masterpage dosyasına ekleyin – Funky81

1

söyleyebilirim Çünkü o olduğunu Ana Sayfa, muhtemelen ViewData'da geçirdiğiniz verilerinizi tring anahtarı. Normal bir görünüm sayfası olsaydı, güçlü bir şekilde yazılmış bir sayfaya sahip olmak daha iyi olurdu, ancak bu farklı bir durum. Yani muhtemelen denetleyicisi bir şey bu yapardın:

ViewData["MasterPageData"] = FunctionToGetData(); 

Ve sonra böyle Usta Sayfa şeye: kontrolünde Sonra

<% 
    if (ViewData["MasterPageData"] != null) 
    { 
     Html.RenderPartial("ControlName.ascx", ViewData); 
    } 
%> 

, süreç normal bir görünüm sayfasında olduğundan gibi:

<% var categories = (CastIfNeeded)ViewData["MasterPageData"]; %> 

process as normal... 

Henüz bir ana sayfaya veri aktarmak zorunda kalmadım, ancak bunu yaptığınızı düşünürdüm. Daha fazla bilgi here.

DÜZENLEME: Geçerli projemde yaptığım şeyi yansıtmak için biraz değiştirdim.

+0

+1 iyi bir bilgi. Bu örnekte size şunu sormama izin verin: geçirdiğiniz veri [object] modeli olarak. Kısmi tarafa nasıl başvurursunuz? Öğretici ViewData yöntemini gösterir. – BuddyJoe

+0

Sorunuza cevap verin (umarım). –

7

Ana sayfanızın görünüm bilgisine sahip olmasını istemiyor musunuz? Sen ... TÜM diğer viewdata sınıfları devralan bir taban görünümü veri sınıfını alarak

BaseViewData.cs çözebilir - Bu tüm diğer viewdata sınıfları

public class BaseViewData 
{ 
    public string Title { get; set; } 
    public string MetaKeywords { get; set; } 
    public string MetaDescription { get; set; } 
    IList<Category> NavCategoryList { get; set; } 
} 

gelen devralır bir viewdata sınıftır Şimdi Site.Master sayfasında sadece

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<BaseViewData>" %> 

<title><%=ViewData.Model.Title %></title> 
<meta name="keywords" content="<%=ViewData.Model.MetaKeywords %>" /> 
<meta name="description" content="<%=ViewData.Model.MetaDescription %>" /> 

<%= Html.RenderPartial("NavBar", ViewData.Model.NavCategoryList) %> 
önemli ölçüde uygulama mimarisini etkileyebilecek

Bu, ama onun mutlaka kötü bir şey var.

HTHs, Charles

+0

Evet Bu yöntemi takip ediyorum. –

+0

+1 Hmmm. Bu işe yarayabilir ... ve en azından şimdi "ViewData.Model" yi biliyorum. sözdizimi. Henüz bunu neden görmediğimi bilmiyorum. – BuddyJoe

+0

Kigg projesi bu şekilde yapıyor, bunu uygulamak üzereyim. Modelin nereden ve nasıl yüklersiniz, böylece ana sayfa bunu yapabilir: ViewData.Model.Titl – Picflight