2010-12-30 5 views
1

Ich habe eine HTMLExtension-Methode für einen DatePicker erstellt. Ich kann es aus der Sicht verweisen wie folgt (bolded Text für Bild Standort sehen):ASP.NET MVC - Bilddatei kann nicht gefunden werden, wenn sie mit IIS ausgeführt wird

 <label for="Effective Start Date", class="codeValuesEditLabel"> Effective Start Date (YYYY/MM/DD): </label> 
    <%= Html.DatePicker("CodeValueNewEditModel_EffectStartDate", "CodeValueNewEditModel.EffectStartDate", "../../Content/images/calendar.gif", 
      Model.codeValueNewEditModel.EffectStartDate) %> 

Die HTMLExtension Methode:

public static string DatePicker(this HtmlHelper helper, string id, string name, **string imageUrl**, object date) 
    { 
     StringBuilder html = new StringBuilder(); 

     // Build our base input element  
     html.Append("<input type=\"text\" id=\"" + id + "\" name=\"" + name + "\""); 

     // Model Binding Support  
     if (date != null) 
     { 
      string dateValue = String.Empty; 
      if (date is DateTime? && ((DateTime)date) != DateTime.MinValue) 
       dateValue = ((DateTime)date).ToString("yyyy/MM/dd"); 
      else if (date is DateTime && (DateTime)date != DateTime.MinValue) 
       dateValue = ((DateTime)date).ToString("yyyy/MM/dd"); 
      else if (date is string) 
       dateValue = (string)date; 

      html.Append(" value=\"" + dateValue + "\""); 
     } 

     // We're hard-coding the width here, a better option would be to pass in html attributes and reflect through them  
     // here (default to 75px width if no style attributes)  
     html.Append(" style=\"width: 75px;\" />"); 

     // Now we call the datepicker function, passing in our options. Again, a future enhancement would be to  
     // pass in date options as a list of attributes (min dates, day/month/year formats, etc.)  

     // If there is no image given, open calendar by clicking on text box 
     if (imageUrl == null) 
     { 
      html.Append("<script type=\"text/javascript\">$(document).ready(function() { $('#" + id + "').datepicker({ dateFormat: 'yy/mm/dd', changeMonth: 'true', changeYear: 'true', duration: 0 }); });");  
     } 
     else 
     { 
      html.Append("<script type=\"text/javascript\">$(document).ready(function() { $('#" + id + "').datepicker({ dateFormat: 'yy/mm/dd', showOn: 'button', changeMonth: 'true', changeYear: 'true', buttonImage: '" + **imageUrl** + "', duration: 0 }); });"); 
     } 
     html.Append("</script>"); 

     return html.ToString(); 
    } 

Alles funktioniert, wenn auf dem Entwicklungsserver laufen, aber wenn sie mit IIS ausführen, die Bild wird nicht gefunden. Im Allgemeinen würde ich "Url.Content" verwenden, um diese Probleme zu beheben, aber ich kann das nicht im Javascript platzieren. Hat jemand irgendwelche Vorschläge?

+0

Blick auf die Ausgabe (Quelltext anzeigen) für die beiden unterschiedlichen Host-Standorten (iis und Entwicklung). Wenn das nicht hilft, dein Problem zu lösen, poste es hier. –

+1

Warum können Sie 'Url.Content' nicht um den imageUrl-Parameter verwenden, wenn Sie das Javascript in Ihrem Helfer erstellen? –

+0

Ich habe das Skript-Tag so geändert, dass es: buttonImage: '<% = Url.Content (\ "" + imageUrl + "\")%>' Und die Ansicht so geändert hat, dass sie den folgenden Pfad (imageURL) enthält: "~/Inhalt /images/calendar.gif "Das Image wird jedoch nicht auf dem Entwicklungsserver gefunden. Weißt du, was ich falsch mache? – Jeff

Antwort

0

Sie könnten sich ändern wollen:

<%= Html.DatePicker("CodeValueNewEditModel_EffectStartDate", "CodeValueNewEditModel.EffectStartDate", "../../Content/images/calendar.gif",    Model.codeValueNewEditModel.EffectStartDate) %> 

zu:

<%= Html.DatePicker("CodeValueNewEditModel_EffectStartDate", "CodeValueNewEditModel.EffectStartDate", Url.Content("~/Content/images/calendar.gif"),    Model.codeValueNewEditModel.EffectStartDate) %> 
Verwandte Themen