2009-12-15 11 views
33

मैं अपने आंशिक दृश्य को इस तरह बुला रहा हूं:मेरे आंशिक दृश्य में पैरामीटर गुजर रहा है?

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

क्या मैं आंशिक दृश्य में पैरामीटर पास कर सकता हूं? मैं उन्हें वास्तविक उपयोगकर्ताओं.स्कैक्स पेज में कैसे एक्सेस करूं?

+0

बहुत निकट से संबंधित प्रश्न: http://stackoverflow.com/questions/6549541/how-to-pass-parameters-to-a-partial-view-in-asp- MagicSauce उपयोग –

उत्तर

31

आप एक मॉडल वस्तु आंशिक करने के लिए (उदाहरण के लिए स्ट्रिंग की एक सूची) पास कर सकता है:

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

तो फिर तुम दृढ़ता से आंशिक और Model टाइप संपत्ति उचित प्रकार का हो जाएगा:

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

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

के लिए net-mvc – mrblah

+0

आप कक्षा में नियंत्रक को प्रारंभ करते हैं, पास मॉडल के रूप में देखने के लिए पास है और दृश्य आंशिक पुनः मॉडल को फिर से गुजरता है। –

17

रेंडरपार्टियल के लिए एक और अधिभार है जो आपके मॉडल को पास करेगा।

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

कैसे पहुंचे? वैसे ही जैसे आप सामान्य रूप से होता है किसी भी दृश्य के साथ:

<%= Model.MagicSauce %> 
+9

+1 यदि मैं कई गुणों के साथ कक्षा बनाता हूं, तो मुझे लगता है कि मुझे उस कक्षा को अपने नियंत्रक में प्रारंभ करना होगा, फिर दृश्य में उपयोगकर्ता नियंत्रण को पास कर दें? –

6

यह सिंक करने के लिए कुछ समय लिया, लेकिन MVC जिनके बारे में आप everythin के लिए एक मॉडल, एक दृश्य है, और एक नियंत्रक एक तरह से या किसी अन्य के उपयोग का मतलब है जी, आंशिक दृश्य सहित। सभी तीन तत्व एक साथ फिट कैसे हो सकते हैं पहले थोड़ा डरावना हो सकता है। मैं अभी तक एक नहीं किया था, और यह काम करता है - वाहू!

आशा है कि यह अगले व्यक्ति की मदद करे .... क्षमा करें, मैं .NET रूपों के बजाय रेज़र का उपयोग कर रहा हूं। मैं एक SQL सर्वर डेटाबेस से डेटा को एंटिटी फ्रेमवर्क में भी खींच रहा हूं, जिसे डेवलपर का उपयोग करने की संभावना है। मैं शायद वेबग्रिड के साथ थोड़ा सा ओवरबोर्ड चला गया, जो एक foreach स्टेटमेंट से कहीं ज्यादा सुरुचिपूर्ण है। एक मूल @ webgrid.GetHtml() प्रत्येक कॉलम और पंक्ति प्रदर्शित करेगा।

पृष्ठभूमि

इस कामकाजी उदाहरण में, उपयोगकर्ताओं ने चित्र अपलोड किए हैं। आंशिक दृश्य का उपयोग करके उनके चित्र उनके संपादन रूप में प्रदर्शित होते हैं। ImageID और FileName मेटाडेटा SQL सर्वर में जारी है जबकि फ़ाइल स्वयं// सामग्री/उपयोगकर्ता चित्र निर्देशिका में जारी है।

मुझे पता है कि यह थोडा विशाल है, क्योंकि व्यक्तिगत डेटा अपलोड करने और संपादित करने के सभी विवरण नहीं दिखाए जाते हैं। बस एक आंशिक दृश्य का उपयोग करने का सार्थक भागों, पर ध्यान केंद्रित कर रहे हैं कुछ बोनस एफई में फेंक दिया के साथ यद्यपि। नामस्थान जी

आंशिक देखें मॉडल एस & के लिए MVCApp3 है ViewModels.cs

एसक्यूएल सर्वर छवियाँ तालिका में छवि आईडी और फ़ाइल नाम के अलावा कई कॉलम शामिल हैं जैसे [कैप्शन], [विवरण], एक एमडी 5 हैश एक ही छवि को कई बार अपलोड करने से रोकने के लिए, और अपलोड तिथि। व्यूमोडेल एंटिटी को अपनी तस्वीरों को देखने के लिए न्यूनतम आवश्यक न्यूनतम तक पहुंचता है।

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

मुख्य दृश्य देखें Edit.cshtml

नोट डाली/परिवर्तित दृढ़ता से ViewData [] टाइप करने के लिए।

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

आप आंशिक दृश्य के लिए उपयोग करने के लिए आप एक "मॉडल आइटम शब्दकोश में पारित कर दिया मिल जाएगा दृढ़ता से टाइप मॉडल निर्धारित नहीं करते हैं प्रकार 'System.Data.Entity.DynamicProxies की है। .. "त्रुटि है क्योंकि यह मानता है कि आपके माता-पिता/मास्टर मॉडल गुजर रहे हैं।

आंशिक दृश्य देखें Picts.cshtml (पूरे फ़ाइल सामग्री दिखाया गया है)

@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>) 
      )) 

नियंत्रक IdentityController.cs

डेटा सामग्री को व्यूडाटा ["MyPartialViewModelKeyName"] में सेट करें, जो आपके आंशिक दृश्य का उपभोग करेगा। आप शब्दकोश कुंजी को जो भी नाम चाहते हैं उसे दे सकते हैं, लेकिन मैंने इसे आंशिक vi के साथ संगत होने के लिए ViewData ["Picts"] दिया ईवी फ़ाइल नाम और इसकी दृश्य मॉडल वर्ग परिभाषा।

क्योंकि चित्र एकाधिक उपयोगकर्ताओं के बीच साझा किए जा सकते हैं, इसलिए उपयोगकर्ता द्वारा संबंधित, या साझा किए गए चित्रों को वापस करने के लिए नेस्टेड सेल्स और आंतरिक जोड़ों का उपयोग करके एंटीटी फ्रेमवर्क में संबंधित पीआईटीए क्वेरी के साथ कई से अधिक तालिका होती है। :

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

आप इतनी उत्कृष्टता को चट्टान करते हैं। आपने बस इतना ही कहा है कि वास्तव में क्लिक किया और मुझे मेरी समयसीमा खोने से बचाया। मैं <3 आप सब कुछ करने के लिए समय लेने के लिए! धन्यवाद!!! – 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); 
} 

// यहाँ यह करने के लिए --not ज्यादा आंशिक दृश्य नियंत्रक है! सार्वजनिक व्यू रीसल्ट पिक्ट्स (इंट आईडी) { रिटर्न व्यू (व्यूडाटा ["पिक्ट्स"]); }

[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); 
} 

}

संबंधित मुद्दे