2012-07-04 22 views
8

में खाली पहली पंक्ति मैं एमवीसी 3 से एमवीसी 4 में माइग्रेट कर चुका हूं और निम्न समस्या का सामना कर रहा हूं।रेजर एमवीसी 4 आरसी

@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
} 
<?xml version="1.1" encoding="UTF-8" ?> 
<dc> 
    @foreach (var dcLink in (IEnumerable<DcLink>)ViewData["SupportedDcs"]) 
    { 
     <link rel="@dcLink.RelUri.ToString()" href="@dcLink.DcUri.ToString()" /> 
    } 
</dc> 

यह मेरा विचार है। मेरे लेआउट सिर्फ एक लाइन

@RenderBody() 
MVC 3 <?xml version="1.1" encoding="UTF-8" ?> में

तो पहली पंक्ति में दिखाई दिया है, लेकिन अब, दूसरी पंक्ति पर अपनी प्रकट होता है, वें पहली पंक्ति खाली छोड़ने से।

enter image description here

मैं इसे पहली पंक्ति पर प्रस्तुत करना के रूप में यह MVC 3 में किया गया था बना सकते हैं?

वैसे भी।

@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
}<?xml version="1.1" encoding="UTF-8" ?> 

यह काम करेगा, लेकिन ऐसा नहीं है कि मैं बिल्कुल क्या करना चाहता हूं।

+0

मुझे एमवीसी 4 व्यवहार में कुछ भी बीएसडी नहीं दिख रहा है: यह पृष्ठ में सभी कैरिज रिटर्न को कॉपी करता है जो कोड ब्लॉक से बाहर हैं, इसलिए यदि आप कैरिज रिटर्न नहीं चाहते हैं तो आपको

+0

मुझे आउटपुट पर प्रभावशाली रूप से प्रभाव डालने के लिए कोड ब्लॉक की आवश्यकता नहीं है। यह सिर्फ गलत है। यह एमवीसी 3 में ठीक था। –

+0

मुद्दा यह है कि कैरिज रिटर्न कोड ब्लॉक से बाहर है, इसलिए यह बाहर निकलने की सूचना दी गई है। जबकि वीबी लाइन उन्मुख सी # नहीं है। यह स्पष्ट है कि एमवीसी 4 एमवीसी 3 की तुलना में कोड ब्लॉक की एक अलग परिभाषा लेता है .. लेकिन मुझे नहीं लगता कि कोई यह कह सकता है कि एमवीसी 4 परिभाषा "गलत है" ... बस अलग है। –

उत्तर

6

अस्थायी फिक्स? एक्शनफिल्टर और खाली पहली पंक्ति को बाहर निकालें? स्पष्ट रूप से यदि आप उपयुक्त हो तो प्रतिक्रिया पर अन्य खनन भी कर सकते हैं।

public class TranslationFilter : MemoryStream 
{ 
    private Stream filter = null; 

    public TranslationFilter(HttpResponseBase httpResponseBase) 
    { 
     filter = httpResponseBase.Filter; 
    } 

    public override void Write(byte[] buffer, int offset, int count) 
    { 
     var response = UTF8Encoding.UTF8.GetString(buffer); 

     // remove all newlines 
     response = response.Replace(System.Environment.NewLine, ""); 

     /* remove just first empty line 
      if (response.Substring(0, 2) == "\r\n") 
     { 
      response = response.Substring(2, response.Length - 2); 
     } */ 

     filter.Write(UTF8Encoding.UTF8.GetBytes(response), offset, UTF8Encoding.UTF8.GetByteCount(response)); 
    } 
} 

public class ResponseFilter : ActionFilterAttribute 
{ 
    public ResponseFilter() 
    { 
    } 

    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
     base.OnResultExecuted(filterContext); 
     filterContext.HttpContext.Response.Filter = new TranslationFilter(filterContext.HttpContext.Response); 
    } 
} 

और इसे नियंत्रक विधि में जोड़ें?

[ResponseFilter] 
public ActionResult Index() 
{ 
return View(); 
} 
+0

यह पूरा समाधान नहीं है। नई लाइनें प्रत्येक @ {} ब्लॉक (केवल पहले एक नहीं) पर दिखाई देती हैं, इसलिए मैं उस समाधान को प्रीफर कर दूंगा जो इसे संभालेगा। लेकिन, यदि कोई विकल्प नहीं होगा, तो मैं आपका प्रश्न स्वीकार करूंगा। –

+0

सभी नई लाइनों को हटाने के लिए समायोजित, लेकिन जाहिर है कि यह वही नहीं हो सकता है जो आप चाहते हैं - ब्राउज़र में एचटीएमएल स्रोत को पढ़ने में मुश्किल होती है। खुशी है कि मैं सहायता की है। – Phil

+0

यह सभी नई लाइनों को हटाने के बारे में नहीं है। यह @ {} ब्लॉक द्वारा coused लाइनों को हटाने के बारे में है। –

2

मैं जानता हूँ कि तुम सिर्फ @{} के अंत करने के लिए टैग चलती सुझाव दिया लेकिन क्यों कि इससे पहले कि यह जगह नहीं। इसके अलावा, क्या यह रिक्त स्थान त्रुटि या समस्या उत्पन्न कर रहा है? आप स्पष्ट रूप से देख सकते हैं कि यह आपके कोड द्वारा बनाई गई व्हाइटस्पेस की वजह से है और एमवीसी या रेज़र से नहीं है।

शायद कुछ इस तरह:

@using InvoiceDocflow.Controllers 
<?xml version="1.1" encoding="UTF-8" ?> 
@{ 
Response.ContentType = "text/xml"; 
} 
1

ResponseFilter बिना एक और उन्हें आसानी से ठीक। सीधे शब्दों में cshtml फ़ाइल के तल पर @using डाल:

<?xml version="1.1" encoding="UTF-8" ?> 
<dc> 
    @foreach (var dcLink in (IEnumerable<DcLink>)ViewData["SupportedDcs"]) 
    { 
     <link rel="@dcLink.RelUri.ToString()" href="@dcLink.DcUri.ToString()" /> 
    } 
</dc> 
@using InvoiceDocflow.Controllers 
@{ 
    Response.ContentType = "text/xml"; 
} 
2

समाधान एक लंबे समय खर्च इसे ठीक करने की कोशिश कर के बाद मेरे लिए काम किया है, तो इनमें से कोई नहीं - यह बहुत आसान होना चाहिए कि यह सिर्फ एक खाली है, क्योंकि लाइन - मैंने इसके बारे में एक ब्लॉग पोस्ट लिखा था।

http://devstuffs.wordpress.com/2014/02/07/first-line-empty-in-razor/

+0

"समाधान 2" बहुत अच्छा काम करता है (मैं कैश मेनिफेस्ट फ़ाइल उत्पन्न कर रहा हूं)। साझा करने के लिए धन्यवाद! –

+0

टिप्पणी में evanswd द्वारा सुझाव मेरे लिए ठीक काम किया और वास्तव में आसान था! –

+1

कृपया उत्तर में समाधान का इनलाइन सारांश या इस लिंक को टिप्पणी में परिवर्तित करें। –

1

आप ले जाते हैं:

<?xml version="1.1" encoding="UTF-8" ?> 

एक लेआउट टेम्पलेट के शीर्ष में तो अपने xml पेज कि और उत्पादन अपने xml डेटा यह काम करना चाहिए वारिस है।

6

कैश मेनिफेस्ट फ़ाइल को वापस करने का प्रयास करते समय पृष्ठ के शीर्ष पर रिक्त रेखाओं के साथ एक समान समस्या में भाग गया। समाधान, एक प्रतिक्रिया जोड़ें। ("..."), यह पृष्ठ की पहली पंक्ति में होगा।

@{ 
    Layout = null; 
    Response.Write("CACHE MANIFEST"); 

} ....... 
+0

यह अनुचित उत्तर मेरे लिए काम किया। एक्सएमएल फाइलों में बिना किसी अग्रणी सफेद स्पेस के पहले लाइन पर डक्टटाइप होना चाहिए। पृष्ठ पर किसी और चीज़ से पहले @ {} अनुभाग निष्पादित हो जाता है। तो रेज़ोर पेज सामग्री से पहले अग्रणी बाहरी सफेद स्थान जोड़ता है इससे पहले Response.Write() को भी निष्पादित किया जाएगा। कुछ अन्य उत्तरों में सुझाए गए अनुसार, कार्यप्रणाली को शीर्ष के ऊपर ले जाना, समस्या को ठीक नहीं किया। – Roberto

4

मुझे पता है कि यह एक पुराना सवाल है, लेकिन मुझे यह पता चला जब मैं इस समस्या का हल ढूंढ रहा था। चूंकि किसी के पास कोई आसान समाधान नहीं है, यहां मेरा है:

मैं सामान्य दृश्य के बजाय आंशिक दृश्य का उपयोग करके इसे ठीक करने में सक्षम था। मुझे विश्वास है कि समस्या लेआउट पर आती है, भले ही आप इसे शून्य पर सेट करते हैं, फिर भी यह एक खाली पहली पंक्ति जोड़ता है। @ {} विज्ञापन एक रिक्त रेखा भी है, इसलिए आपको इसे अपने दृश्य के नीचे ले जाना चाहिए।

तो सिर्फ एक आंशिक दृश्य जोड़ सकते हैं और अपने नियंत्रक जैसे आंशिक दृश्य वापसी है: (तब

public ActionResult GenerateXML() 
{ 
    return PartialView("_XML"); 
} 

अपने आंशिक दृश्य में अपने @ {} पर साथ आप इस तरह इसे सेट अप करने की आवश्यकता होगी नीचे):

<?xml version="1.0" encoding="UTF-8" ?> 
<response> 
    <message>Response Message</message> 
</response> 

मैं इस आशा:

@model string 
<?xml version="1.0" encoding="UTF-8" ?> 
<response> 
    <message>@Model</message> 
</response> 
@{ Response.ContentType = "text/xml";} 

इस का एक HTML स्रोत में परिणाम होगा इस समस्या में भाग लेने वाले अन्य लोगों की सहायता करता है।

_ViewStart.cshtml

@{ 
    Layout = null; 
    Response.Write("<!DOCTYPE html>"); 
} 

एक और .cshtml

@model ViewModel<EshopWebsiteOrder> 
<html> 
<head> 
    <meta charset="utf-8" /> 

अंत में, यह भावना एक पर आम DOCTYPE को परिभाषित करता है:

+0

यह एकमात्र समाधान है जो मेरे लिए काम करता है –

+0

लागू करने के लिए सरल, और सीधे काम किया। –

2

मैं इसी तरह की समस्या इस तरह से हल जगह।

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