2009-12-15 15 views
33

Kısmi görünümümü şu şekilde arıyorum:parametreleri kısmi görünümüme geçiriyor musunuz?

 <% Html.RenderPartial("~/controls/users.ascx"); %> 

Parametreleri kısmi görünümde geçirebilir miyim? Onlara gerçek users.ascx sayfasında nasıl erişeceğim?

+0

Çok yakından ilgili soru: http://stackoverflow.com/questions/6549541/how-to-pass-parameters-to-a-partial-view-in-asp- MagicSauce kullanımı için net-mvc –

cevap

31

Sen (örneğin dizeleri listesini) kısmi bir model nesnesi geçebileceği: Sonra

<% Html.RenderPartial("~/controls/users.ascx", new string[] { "foo", "bar" }); %> 

Eğer güçlü kısmi ve Model yazın mülkiyet uygun türde olacaktır:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.Collections.Generic.IEnumerable<string>>" %> 

<% foreach (var item in Model) { %> 
    <div><%= Html.Encode(item) %></div> 
<% } %> 
+0

Birçok özellikli bir sınıf oluşturursam, denetleyicimde bu sınıfı başlatmam gerekiyor, daha sonra görünümde kullanıcı denetimine geçmeliyim? – mrblah

+0

Denetleyicideki sınıfı başlatırsınız, modele görünüm olarak geçiş yaparsınız ve görünüm kısmi modelin yeniden iletilmesini sağlar. –

17

Modelinizi geçirecek RenderPartial için başka bir aşırı yükleme var.

<% Html.RenderPartial("~/controls/users.ascx", modelGoesHere); %> 

normalde herhangi görüntüsü olur Tıpkı:

<%= Model.MagicSauce %> 
+9

+1 –

6

O lavabo biraz zaman aldı, ancak MVC sadece yaklaşık everythin için Model, Görünüm ve Denetleyici ya da bu şekilde kullanması demektir Kısmi Görünümler dahil olmak üzere g. İlk üç öğenin birbirine uyması ilk başta biraz korkutucu olabilir. Şimdiye kadar hiç yapmadım ve işe yarıyor - Woohoo!

Bunun bir sonraki kişiye yardımcı olmasını umuyorum .... Üzgünüm. Net formlar yerine jilet kullanıyorum. Ayrıca bir SQL Server veritabanından verileri, bir geliştiricinin kullanması muhtemel olan Entity Framework'e çekiyorum. Ayrıca, bir foreach ifadesinden çok daha şık olan WebGrid ile büyük bir olasılıkla denize çıktım. Bir temel @ webgrid.GetHtml() her sütun ve satırı gösterecektir. Bu çalışma örnekte

Arkaplan

, kullanıcıların fotoğraflarını yükledik. Resimler kısmi bir görünüm kullanarak kendi düzenleme formunda görüntülenir. Dosyanın kendisi ~/Content/UserPictures dizininde kalırken, ImageID ve FileName meta verileri SQL Server'da kalıcıdır.

Kişisel verilerin yüklenmesi ve düzenlenmesiyle ilgili tüm ayrıntıların gösterilmemesi nedeniyle, bunun çok büyük bir yarı olduğunu biliyorum. Kısmi Görünüm kullanmadan Sadece germane parçaları EF atılmış bazı ikramiye de olsa odaklandık. ad S & için G.

Kısmi Görünüm Modeli MVCApp3 olduğunu ViewModels.cs

SQL Server Görüntüler tablo, aynı resmin birden çok kez yüklenmesini ve yükleme tarihini önlemek için, [Başlık], [Açıklama], bir MD5 hash dosyası gibi ImageID ve DosyaAdı'na ek olarak çok daha fazla sütun içerir. ViewModel, bir kullanıcının resimlerini görmesi için gerekli olan değeri en aza indirir. Dökme/dönüştürmek

public class Picts 
{ 
    public int ImageID { get; set; } 
    public string FileName { get; set; } 
} 

Ana Görünümü Edit.cshtml

Not kuvvetle ViewData [] yazmaya.

@Html.Partial(
     partialViewName: "Picts", 
     model: (IEnumerable<MVCApp3.Models.Picts>)ViewData["Picts"] 
) 

Eğer sözlüğüne geçirilen bir "modeli madde elde edersiniz Kısmi Manzaralı için kullanmak kesinlikle yazılan model teşkil yoksa

tipi 'System.Data.Entity.DynamicProxies taşımaktadır. .. "hata size üst/ana modeli geçiyoruz varsayar çünkü.

Kısmi Görünümü Picts.cshtml (tüm dosya içeriği gösterilir)

@model IEnumerable<MVCApp3.Models.Picts> 
@{ 
    var pictsgrid = new WebGrid(Model); 
} 
    @pictsgrid.GetHtml(
     tableStyle: "grid", 
     displayHeader: false, 
     alternatingRowStyle: "alt", 
     columns: pictsgrid.Columns( 
      pictsgrid.Column(format:@<text><img src="@Url.Content("~/Content/Users/" + @item.FileName)" alt="@item.ImageID" width="200" /> 
      @Html.ActionLink(linkText: "Delete", actionName: "DeletePicture", routeValues: new { id = @item.ImageID }) 
      </text>) 
      )) 

Kontrolör IdentityController.cs

Veri içeriğini kısmi görünümünüzün kullanacağı ViewData ["MyPartialViewModelKeyName"] olarak ayarlayın. Sözlük anahtarını istediğiniz herhangi bir ad verebilirsiniz, ancak kısmi vi ile tutarlı olması için ViewData ["Picts"] verdim ew dosya adı ve görünümü model sınıf tanımı.

Resimler birden çok kullanıcı tarafından paylaşılabildiğinden, bir kullanıcıya ait olan veya bir kullanıcıyla paylaşılan resimleri döndürmek için iç içe geçmiş iç ve dış birleştirmeler kullanarak Entity Framework'te karşılık gelen bir PITA sorgusuna sahip çoktan çoğa bir tablo vardır. :

public class IdentityController : Controller 
{ 
    private EzPL8Entities db = new EzPL8Entities(); 

    // GET: /Identity/Edit/5 
    [Authorize] 
    public ActionResult Edit(int? id) 
    { 

     if (id == null) 
      return new HttpNotFoundResult("This doesn't exist"); 

     // get main form data 
     ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id) 

    // http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ 
    // get partial form data for just this user's pictures 
       ViewData["Picts"] = (from user in db.ezpl8_Users 
          from ui in user.ezpl8_Images 
          join image in db.ezpl8_Images 
          on ui.ImageID equals image.ImageID 
          where user.ezpl8_UserID == id 
          select new Picts 
          { 
           FileName = image.FileName, 
           ImageID = image.ImageID 
          } 
           ).ToList(); 

     return View(ezIDobj); 
    } 

    // Here's the Partial View Controller --not much to it! 
    public ViewResult Picts(int id) 
    { 
     return View(ViewData["Picts"]); 
    } 

    [Authorize] //you have to at least be logged on 
    public ActionResult DeletePicture(int id) 
    { 
     //ToDo: better security so a user can't delete another user's picture 
     // TempData["ezpl8_UserID"] 
     ezpl8_Images i = db.ezpl8_Images.Find(id); 
     if (i != null) 
     { 
      var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName); 
      System.IO.File.Delete(path: path); 

      db.ezpl8_Images.Remove(i); 
      db.SaveChanges(); 
     } 
     return Redirect(Request.UrlReferrer.ToString()); 
    } 

    protected override void Dispose(bool disposing) 
    { 
     db.Dispose(); 
     base.Dispose(disposing); 
    } 
} 
+2

Çok fazla tuhaflık sallıyorsun. Tüm bunları, gerçekten sonlandırılan ve son günümü kaçırmam için kaydedilen bir şekilde hecelediniz. Bunları yapmak için zaman ayırdığınız için <3! Teşekkür ederim!!! – divamatrix

0
// get main form data 
ezpl8_UsersPhysicalIdentity ezIDobj = db.ezpl8_UsersPhysicalIdentity.Find(id) 

// http://learnentityframework.com/LearnEntityFramework/tutorials/many-to-many-relationships-in-the-entity-data-model/ 
// get partial form data for just this user's pictures 
      ViewData["Picts"] = (from user in db.ezpl8_Users 
         from ui in user.ezpl8_Images 
         join image in db.ezpl8_Images 
         on ui.ImageID equals image.ImageID 
         where user.ezpl8_UserID == id 
         select new Picts 
         { 
          FileName = image.FileName, 
          ImageID = image.ImageID 
         } 
          ).ToList(); 

    return View(ezIDobj); 
} 

// İşte buna --not çok Kısmi View Controller var! public ViewResult Resim İşlemleri (int id) { dönüş Görünümü (ViewData ["Picts"]); }

[Authorize] //you have to at least be logged on 
public ActionResult DeletePicture(int id) 
{ 
    //ToDo: better security so a user can't delete another user's picture 
    // TempData["ezpl8_UserID"] 
    ezpl8_Images i = db.ezpl8_Images.Find(id); 
    if (i != null) 
    { 
     var path = System.IO.Path.Combine(Server.MapPath("~/Content/Users"), i.FileName); 
     System.IO.File.Delete(path: path); 

     db.ezpl8_Images.Remove(i); 
     db.SaveChanges(); 
    } 
    return Redirect(Request.UrlReferrer.ToString()); 
} 

protected override void Dispose(bool disposing) 
{ 
    db.Dispose(); 
    base.Dispose(disposing); 
} 

}