2008-12-17 7 views
15

मैं की तरह एक मार्ग का उपयोग कर रहा यह एक:विशेष वर्ण कैसे पास करें ताकि ASP.NET MVC सही क्वेरी स्ट्रिंग डेटा को संभाल सके?

routes.MapRoute("Invoice-New-NewCustomer", 
    "Invoice/New/Customer/New/{*name}", 
    new { controller = "Customer", action = "NewInvoice" }, 
    new { name = @"[^\.]*" }); 

एक कार्रवाई है जो इस मार्ग संभालती है:

public ActionResult NewInvoice(string name) 
{ 
    AddClientSideValidation(); 
    CustomerViewData viewData = GetNewViewData(); 
    viewData.InvoiceId = "0"; 
    viewData.Customer.Name = name; 
    return View("New", viewData); 
} 

जब मैं return RedirectToAction("NewInvoice", "Customer", new {name}); फोन और नाम बराबर करने के लिए "सी # लड़का" है, "नाम" पैरामीटर को "सी" में छोटा कर दिया गया है।

तो मेरा सवाल है: एएसपी.नेट एमवीसी के साथ इस तरह के विशेष चरित्र को संभालने का सबसे अच्छा तरीका क्या है?

धन्यवाद!

उत्तर

16

ठीक है, मैंने पुष्टि की है कि यह अब दुर्भाग्य से एएसपी.NET रूटिंग में एक ज्ञात समस्या है। समस्या यह है कि रूटिंग के आंतों में गहराई, हम Uri के लिए रूटिंग पैरामीटर से बचते समय Uri.EscapeString का उपयोग करते हैं। हालांकि, यह विधि "#" चरित्र से नहीं बचती है।

ध्यान दें कि # वर्ण (उर्फ ऑक्टोथोरपे) तकनीकी रूप से गलत चरित्र है। सी भाषा वास्तव में एक "सी" है जिसके बाद संगीत में एक तीव्र संकेत होता है: http://en.wikipedia.org/wiki/Sharp_(music)

यदि आपने तेज संकेत का उपयोग किया है, जो संभावित रूप से इस समस्या को हल कर सकता है। : पी

एक और समाधान, चूंकि अधिकांश लोग ऑक्टोथोरपे का उपयोग करना चाहते हैं, इस मार्ग के लिए एक कस्टम मार्ग लिखना और वर्चुअल पथ पथ प्राप्त करने के बाद, HttpUtility.UrlEncode का उपयोग करके # चिह्न को एन्कोड करें जो # से% 23 को एन्कोड करता है।

फॉलो-अप के रूप में, मैं आपको इस ब्लॉग पोस्ट पर इंगित करना चाहता हूं जो अन्य "अमान्य" पात्रों में गुजरने के बारे में बात करता है। http://haacked.com/archive/2010/04/29/allowing-reserved-filenames-in-URLs.aspx

+0

इस समस्या की जांच करने के लिए समय निकालने के लिए फिल धन्यवाद – labilbe

3

यूआरएल एन्कोडिंग! लिंक बदलें ताकि यह विशेष वर्णों को एन्कोड कर सके।

Server.URLencode(strURL) 

सी # "सी% 23" बन जाएगा।

3

मेरी मशीन पर काम करता है। सबसे आसान संभव उदाहरण बनाने के लिए मैंने यहां क्या किया है।

//Global.asax.cs 

using System.Web.Mvc; 
using System.Web.Routing; 

namespace MvcApplication4 { 
    public class MvcApplication : System.Web.HttpApplication { 
    public static void RegisterRoutes(RouteCollection routes) { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
     "Default",      // Route name 
     "{controller}/{action}/{id}",    // URL with parameters 
     new { controller = "Home", action = "Index", id = "" } // Parameter defaults 
    ); 

     routes.MapRoute("Invoice-New-NewCustomer", 
      "Invoice/New/Customer/New/{*name}", 
      new { controller = "Customer", action = "NewInvoice" }, 
      new { name = @"[^\.]*" }); 
    } 

    protected void Application_Start() { 
     RegisterRoutes(RouteTable.Routes); 
    } 
    } 
} 

//HomeController.cs 
using System.Web.Mvc; 

namespace MvcApplication4.Controllers { 
    [HandleError] 
    public class HomeController : Controller { 
    public ActionResult Index() { 
     return RedirectToAction("NewInvoice", "Customer", new { name = "The C# Guy" }); 
    } 
    } 
} 

//CustomerController.cs 
using System.Web.Mvc; 

namespace MvcApplication4.Controllers { 
    public class CustomerController : Controller { 
     public string NewInvoice(string name) { 
      return name; 
     } 
    } 
} 

मैंने फिर अपना ऐप शुरू किया और/home/index पर नेविगेट किया। यह रीडायरेक्ट होता है और मैंने अपने ब्राउज़र में "सी # गाय" देखा।

+0

यह चालान/नई/ग्राहक/नई/+ सी% 2523 + लड़का या करने के लिए ग्राहक/NewInvoice? नाम =% 2BC% 2523% 2BGuy के लिए पुनः निर्देशित कर रहा है? – labilbe

+0

आह, मैं देखता हूं। मैं इस पर गौर करूंगा। – Haacked

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