2008-08-08 5 views
19

मुझे कुछ लिंक एक टुकड़ा पहचानकर्ता शामिल करना चाहते हैं। इस साइट पर कुछ URL की तरह:Asp.Net MVC ActionLink, RedirectToAction, आदि का उपयोग करते समय एक खंड पहचानकर्ता को शामिल करने का कोई तरीका है?

Debugging: IE6 + SSL + AJAX + post form = 404 error# 5626

वहाँ MVC में निर्मित विधियों में से किसी के साथ ऐसा करने के लिए कोई तरीका है? या मुझे अपने स्वयं के एचटीएमएल सहायकों को रोल करना होगा?

उत्तर

5

हम अपनी अगली रिलीज में इसके लिए समर्थन शामिल करना चाहते हैं।

+0

क्या यह dev10 में जारी होने के लिए लक्षित किया जा रहा है? – ajma

1

संक्षिप्त उत्तर यह है: नहीं। एएसपी.नेट एमवीसी पूर्वावलोकन 3 में कोई एक्शन लिंक में एंकर समेत कोई प्रथम श्रेणी का तरीका नहीं है। रेल के url_for के विपरीत: एंकर, UrlHelper.GenerateUrl (और एक्शनलिंक, रीडायरेक्ट टॉक्शन और जिस पर इसका उपयोग होता है) में एक जादू प्रॉपर्टी नाम नहीं है जो आपको एंकर को एन्कोड करने देता है।

जैसा कि आप इंगित करते हैं, आप अपना खुद का रोल कर सकते हैं। यह शायद सबसे साफ समाधान है।

Hackily, तो आप सिर्फ एक मार्ग में एक लंगर में शामिल हैं और अपने मानकों को हैश में मूल्य निर्दिष्ट कर सकते हैं:

routes.MapRoute("WithTarget", "{controller}/{action}/{id}#{target}"); 
... 
<%= Html.ActionLink("Home", "Index", new { target = "foo" })%> 

यह/होम/सूचकांक/# foo जैसी URL उत्पन्न होगा। दुर्भाग्यवश यह यूआरएल पैरामीटर के साथ अच्छी तरह से नहीं खेलता है, जो यूआरएल के अंत में दिखाई देता है। तो यह हैक वास्तव में केवल साधारण परिस्थितियों में काम करने योग्य है जहां आपके सभी पैरामीटर यूआरएल पथ घटकों के रूप में दिखाई देते हैं।

+1

काम नहीं करता है। # को% 23 में बदल दिया गया है। – jpbochi

3

@Dominic,

मैं लगभग सकारात्मक है कि मार्ग में डालने कि मार्ग समस्याओं का कारण बन जाएगा।

@Ricky,

तक MVC इस के लिए समर्थन हासिल है, तो आप एक छोटे से अधिक "पुराने स्कूल" कैसे आप अपने मार्गों बनाने के बारे में हो सकता है। उदाहरण के लिए, आप परिवर्तित कर सकते हैं:

<%= Html.ActionLink("Home", "Index") %> 

में:

<a href='<%= Url.Action("Index") %>#2345'>Home</a> 

या आप अपने स्वयं के सहायक कि अनिवार्य रूप से एक ही बात करता है लिख सकते हैं।

+1

मैंने एएसपी.नेट एमवीसी पूर्वावलोकन 3 के साथ मार्गों में लक्ष्य की कोशिश की और रूटिंग के साथ कोई समस्या नहीं थी। तो यद्यपि आप "लगभग सकारात्मक" हैं, लेकिन यह आपके लिए उपयोगी होगा कि आप किन मुद्दों पर विस्तार करेंगे। –

18

जैसा कि ब्रैड विल्सन ने लिखा था, आप स्ट्रिंग को संयोजित करके अपने विचारों में अपना स्वयं का लिंक बना सकते हैं। लेकिन RedirectToAction (या समान) के माध्यम से उत्पन्न किसी रीडायरेक्ट के एक टुकड़ा नाम संलग्न करने के लिए आप कुछ इस तरह की आवश्यकता होगी:

public class RedirectToRouteResultEx : RedirectToRouteResult { 

    public RedirectToRouteResultEx(RouteValueDictionary values) 
     : base(values) { 
    } 

    public RedirectToRouteResultEx(string routeName, RouteValueDictionary values) 
     : base(routeName, values) { 
    } 

    public override void ExecuteResult(ControllerContext context) { 
     var destination = new StringBuilder(); 

     var helper = new UrlHelper(context.RequestContext); 
     destination.Append(helper.RouteUrl(RouteName, RouteValues)); 

     //Add href fragment if set 
     if (!string.IsNullOrEmpty(Fragment)) { 
      destination.AppendFormat("#{0}", Fragment); 
     } 

     context.HttpContext.Response.Redirect(destination.ToString(), false); 
    } 

    public string Fragment { get; set; } 
} 

public static class RedirectToRouteResultExtensions { 
    public static RedirectToRouteResultEx AddFragment(this RedirectToRouteResult result, string fragment) { 
     return new RedirectToRouteResultEx(result.RouteName, result.RouteValues) { 
      Fragment = fragment 
     }; 
    } 
} 

और फिर, अपने नियंत्रक में, आप कॉल चाहते हैं:

return RedirectToAction("MyAction", "MyController") 
     .AddFragment("fragment-name"); 

यह यूआरएल सही ढंग से उत्पन्न करना चाहिए।

+3

यह बहुत अच्छा है। एमवीसी 3 में 'एक्शनलिंक' पर एक अधिभार है जो आपको एक टुकड़ा करने देता है, लेकिन 'रीडायरेक्ट टॉक्शन' नहीं। – kamranicus

+0

आप, महोदय, मेरे नायक हैं। :) –

0

यह क्लाइंट साइड समाधान है लेकिन यदि आपके पास jquery उपलब्ध है तो आप ऐसा कुछ कर सकते हैं।

<script language="javascript" type="text/javascript"> 
    $(function() { 
     $('div.imageHolder > a').each(function() { 
      $(this).attr('href', $(this).attr('href') + '#tab-works'); 
     }); 
    }); 
</script> 
4

MVC3 में (और संभवतः पहले मैं चेक नहीं किया गया है), तो UrlHelper.GenerateUrl टुकड़ा पैरामीटर में गुजर उपयोग कर सकते हैं।यहाँ एक सहायक विधि मैं functionalityL रैप करने के लिए उपयोग करें

public static string Action(this UrlHelper url, string actionName, string controllerName, string fragment, object routeValues) 
{ 
    return UrlHelper.GenerateUrl(
     routeName: null, 
     actionName: actionName, 
     controllerName: controllerName, 
     routeValues: new System.Web.Routing.RouteValueDictionary(routeValues), 
     fragment: fragment, 
     protocol: null, 
     hostName: null, 
     routeCollection: url.RouteCollection, 
     requestContext: url.RequestContext, 
     includeImplicitMvcValues: true /*helps fill in the nulls above*/ 
    ); 
} 
+0

थोड़ा अजीब, लेकिन यह यहां सबसे अच्छे जवाब है। शायद, दूसरों को बस दिनांकित कर रहे हैं। – jpbochi

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