2011-03-05 16 views
6

में छवि नहीं मिली छवि को दिखाने के लिए मेरे पास एएसपीनेट एमवीसी प्रोजेक्ट है। एक शानदार विचारों में मैं चार प्रोमेक्ट को अपने प्रोक्ट के अंदर अलग-अलग फ़ोल्डर से कॉल करता हूं।Asp.net एमवीसी

कभी-कभी छवि नहीं मिल सकती है। मैं प्रत्येक फ़ोल्डर के लिए एक छवि सेट करना चाहता हूं क्योंकि सभी 4 फ़ोल्डर में छवि के विभिन्न भिन्न आकार होते हैं इसलिए मुझे प्रत्येक फ़ोल्डर के लिए विशिष्ट आकार की छवि सेट करने की आवश्यकता होती है।

जब छवि को ऐसा करने का कोई तरीका नहीं मिला तो मैं डिफ़ॉल्ट छवि कैसे दिखा सकता हूं। मेरा मतलब है कि निर्देशिका में कोई भी छवि नहीं है जब निर्देशिका में छवि नहीं है जिसे मैंने विचारों में बुलाया था।

छवि के मामले में छवि दिखाने के लिए उनका कोई भी तरीका नहीं है।

एएसपीनेट 4 एमवीसी 3 में ऐसा करने का कोई तरीका है। Web.config का उपयोग करके या कुछ और सेट करना।

+0

आप alt = "" विशेषता छवि टैग पर उपयोग कर सकते हैं, यह करने के उद्देश्य से है कि तुम क्या करने के लिए है पूछना। – Orbit

+0

@Oribt - 'alt' विशेषता किसी अनुपलब्ध छवि के स्थान पर एक छवि प्रदर्शित नहीं करती है, यह टेक्स्ट दिखाती है। –

उत्तर

7

ऐसा करने का सबसे आसान तरीका एक HTML सहायक के साथ है। छवि फ़ाइल नाम दिखाने से पहले फ़ाइल सिस्टम की जांच करने के अतिरिक्त प्रदर्शन हिट से सावधान रहें। हालांकि हिट एक छोटा सा है, इसलिए जब तक आपको बहुत अधिक ट्रैफिक नहीं मिल रहा है तब तक आपको कोई समस्या नहीं दिखाई देगी। फिर आप कुछ प्रकार के कैशिंग को कार्यान्वित कर सकते हैं ताकि ऐप "जानता है" अगर फ़ाइल मौजूद है या नहीं।

आप के लिए एक कस्टम एचटीएमएल सहायक का उपयोग कर सकते यह

public static class ImageHtmlHelpers 
{ 
    public static string ImageUrlFor(this HtmlHelper helper, string contentUrl) 
    { 
     // Put some caching logic here if you want it to perform better 
     UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
     if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl))) 
     { 
      return urlHelper.Content("~/content/images/none.png"); 
     } 
     else 
     { 
      return urlHelper.Content(contentUrl); 
     } 
    } 
} 

फिर अपने ध्यान में रखते हुए आप बस का उपयोग कर यूआरएल बना सकते हैं:

<img src="<% Html.ImageUrlFor("~/content/images/myfolder/myimage.jpg"); %>" /> 

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

public static class ImageHtmlHelpers 
{ 
    public static string ImageUrlFor(this HtmlHelper helper, string imageFilename, ImageSizeFolderEnum imageSizeFolder) 
    { 
     UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
     string contentUrl = String.Format("~/content/userimages/{0}/{1}", imageSizeFolder, imageFilename); 
     if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(contentUrl))) 
     { 
      return urlHelper.Content(String.Format("~/content/userimages/{0}/none.png", imageSizeFolder)); 
     } 
     else 
     { 
      return urlHelper.Content(contentUrl); 
     } 
    } 
} 

फिर अपने ध्यान में रखते हुए आप बस यूआरएल का उपयोग कर सकते हैं:

<img src="<% Html.ImageUrlFor("myimage.jpg", ImageSizeFolderEnum.Small); %>" /> 

बेहतर प्रोग्राम संबंधी नियंत्रण के लिए एक Enum सुझाव दिया है, तो फ़ोल्डर एक निश्चित सेट है, लेकिन एक त्वरित के लिए और बुरा दृष्टिकोण, नहीं कारण है कि आप सिर्फ एक स्ट्रिंग का उपयोग नहीं कर सकते हैं फ़ोल्डर उत्पन्न db आदि है

+1

+1 - सरल और पुन: प्रयोज्य। आप एक ओवरराइड भी कर सकते हैं जिसमें एक बुलियन ध्वज था यह इंगित करने के लिए कि छवि नहीं है, तो 'नहीं मिली' छवि का उपयोग किया जाना चाहिए। यह परिदृश्यों में उपयोगी है जहां देखो और महसूस की सुविधा की आवश्यकता होती है, निश्चित रूप से div.img सीएसएस लापता छवि प्लेसहोल्डर के आकार को नियंत्रित कर सकता है –

+0

धन्यवाद जिम! फ़ोल्डर के लिए एक दृष्टिकोण भी जोड़ा गया है यदि उनके पास अलग-अलग फ़ोल्डरों में भिन्न आकार हैं या उस परिदृश्य के लिए नामकरण सम्मेलन है। – Gats

+0

[यहां] (http://stackoverflow.com/questions/19931698/how-to-display-a-default-image-in-case-the-source-does-not-exists) समान समाधान है और आप इसका उपयोग कर सकते हैं ** यदि छवि मौजूद नहीं है, तो डिफ़ॉल्ट छवि दिखाने के लिए ** सरल Jquery समाधान **, [this] (http://stackoverflow.com/a/980948/2218697) देखें, आशा किसी की सहायता करती है। – stom

0

आप एक नियंत्रक कार्रवाई FileResult वापस कर सकते हैं, और string के पैरामीटर को स्वीकार कर सकते हैं जो छवि पथ का वर्णन करता है।

नियंत्रक कार्रवाई डिस्क से छवि को लोड करने की कोशिश करती है और इसे FileResult के रूप में वापस करने की कोशिश करती है, या यदि फ़ाइल डिस्क से अनुपलब्ध है, तो जगह के बजाय एक स्थान धारक 'छवि नहीं मिली' छवि लौटाएं।

फिर छवि (या इसके प्लेसहोल्डर) को प्रदर्शित करने के लिए आप srcimg तत्व की छवि सीधे छवि की बजाय नियंत्रक कार्रवाई में सेट करेंगे।

+0

आपकी आवाज दिलचस्प लग रही है। क्या आप मुझे नियंत्रक में कार्रवाई से चेक अस्तित्व के लिए कुछ कोड दिखा सकते हैं। –

1

सब इतना MVC पता नहीं है, लेकिन यहाँ मेरा विचार फिर भी है:

एक विशिष्ट नियंत्रक जो जो भी आपके तर्क के आधार पर एक छवि को हासिल करेगा लो। माइकल की तरह कहा कि कुछ (छवि) सफल लेखा परीक्षा पर लौट आया - जिसका अर्थ है कि छवि मिलती है। यदि नहीं मिला तो स्थिति कोड 404 या ऐसा कुछ लौटाएं।

बाकी को क्लाइंट पर जावास्क्रिप्ट के माध्यम से संभाल लें। तो आईएमजी टैग में आतंकवादी घटना के लिए कुछ लिखें। आईएमजी स्रोत w/आपकी छवि को प्रतिस्थापित कर सकते हैं पोस्टर छवि फ़ाइल नहीं मिला। यहां कुछ हद तक (लेकिन बिल्कुल नहीं) jquery के माध्यम से ऐसा कैसे करें।

$(function(){ 
    $('#myimg').error(function(){ 
     $('#result').html("image not found"); 
    }); 
}); 

पुनश्च: http://jsfiddle.net/Fy9SL/2/ यदि u jQuery कोड का पूरा डेमो में रुचि रखते हैं।

+0

मुझे आपके जैसा ही सोच है। यह अच्छा है कि मैं पहले से ही बात कर रहा हूं लेकिन नियंत्रक से छवि को सर्वश्रेष्ठ रूप से पास कर रहा हूं क्योंकि मुझे जो कुछ चाहिए वह केवल उस कोड के साथ पूरा हो सकता है जिसे मैं नियंत्रक में डाल सकता हूं जो जावास्क्रिप्ट में कभी नहीं किया जा सकता है। मदद के लिए धन्यवाद। –

1
public static MvcHtmlString Image(this HtmlHelper helper, string src, string alt) 
    { 
     var builder = new TagBuilder("img"); 

     // Put some caching logic here if you want it to perform better 
     UrlHelper urlHelper = new UrlHelper(helper.ViewContext.RequestContext); 
     if (!File.Exists(helper.ViewContext.HttpContext.Server.MapPath(src))) 
     { 
      src = urlHelper.Content("~/content/images/none.png"); 
     } 
     else 
     { 
      src = urlHelper.Content(src); 
     } 

     builder.MergeAttribute("src", src); 
     builder.MergeAttribute("alt", alt); 
     return MvcHtmlString.Create(builder.ToString(TagRenderMode.SelfClosing)); 
    } 
संबंधित मुद्दे