ASP.NET MVC में मॉडल में UrlHelper को कॉल करें


159

मुझे ASP.NET MVC में एक मॉडल में कुछ URL जनरेट करने की आवश्यकता है। मैं UrlHelper.Action () की तरह कुछ कॉल करना चाहूंगा जो URL उत्पन्न करने के लिए मार्गों का उपयोग करता है। मुझे होस्टनाम, स्कीम आदि जैसे सामान्य रिक्त स्थान भरने में कोई आपत्ति नहीं है।

क्या कोई विधि है जो मैं उसके लिए कह सकता हूं? क्या एक UrlHelper के निर्माण का एक तरीका है?


1
मैं खुद इस बारे में सोच रहा था, लेकिन ध्यान रहे कि Url.Action एक रिश्तेदार URL उत्पन्न करेगा। सुनिश्चित करें कि यही आप चाहते हैं।
विवियन नदी

जवाबों:


277

सहायक टिप, किसी भी ASP.NET अनुप्रयोग में, आप वर्तमान HttpContext का संदर्भ प्राप्त कर सकते हैं

HttpContext.Current

जो System.Web से लिया गया है। इसलिए, ASP.NET MVC अनुप्रयोग में निम्नलिखित कहीं भी काम करेगा:

UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
url.Action("ContactUs"); // Will output the proper link according to routing info

उदाहरण:

public class MyModel
{
    public int ID { get; private set; }
    public string Link
    {
        get
        {
            UrlHelper url = new UrlHelper(HttpContext.Current.Request.RequestContext);
            return url.Action("ViewAction", "MyModelController", new { id = this.ID });
        }
    }

    public MyModel(int id)
    {
        this.ID = id;
    }
}

Linkबनाई गई MyModel ऑब्जेक्ट पर प्रॉपर्टी को कॉल करना वैध Url को Global.ax में रूटिंग के आधार पर मॉडल देखने के लिए लौटाएगा


क्या आप सुनिश्चित हैं कि एक HttpContext.Current.Request.RequestContext है? HttpContext.Current.Request लगता है कि एक RequestContext नहीं है।
पुतीनो

1
अजीब है कि। मैंने अभी इस समाधान का परीक्षण किया है और यह पूरी तरह से काम करता है। मैं ASP.NET MVC 2 पूर्वावलोकन 2 चला रहा हूं, लेकिन मुझे लगता है कि यह सभी संस्करणों में काम करता है। निश्चित नहीं है कि यह आपके लिए काम क्यों नहीं कर रहा है। क्या आप MVC प्रोजेक्ट के बाहर क्लास बना रहे हैं? यह भी सुनिश्चित करें कि usingदोनों के लिए हैं System.WebऔरSystem.Web.Mvc
उमर

मैं एक ASP.NET MVC 1 परियोजना पर हूं, मैंने लापता अनुपस्थितियों के बारे में सोचा लेकिन मेरे पास दोनों हैं।
पिल्लानो

सच में यकीन नहीं है कि यह क्यों नहीं दिखा रहा है। अगर किसी और की पुष्टि कर सकता है यह ASP.NET MVC 1 में मौजूद नहीं है जो बहुत अच्छा होगा। मेरे पास केवल एक मशीन है जिसमें VS2010 और MVC 2 स्थापित हैं। यदि आप रुचि रखते हैं, MVC RC 2 haacked.com/archive/2009/12/16/aspnetmvc-2-rc.aspx
Omar

6
ध्यान दें कि Request.RequestContex .NET31 +
h - n

64

मुझे उमर का जवाब पसंद है लेकिन वह मेरे लिए काम नहीं कर रहा है। बस रिकॉर्ड के लिए यह समाधान मैं अभी उपयोग कर रहा हूं:

var httpContext = HttpContext.Current;

if (httpContext == null) {
  var request = new HttpRequest("/", "http://example.com", "");
  var response = new HttpResponse(new StringWriter());
  httpContext = new HttpContext(request, response);
}

var httpContextBase = new HttpContextWrapper(httpContext);
var routeData = new RouteData();
var requestContext = new RequestContext(httpContextBase, routeData);

return new UrlHelper(requestContext);

इसमें मेरी साइट का URL है। वहां, मैंने इसे हटा दिया।
प्यूपेनो

4
यह देखते हुए कि UrlHelper वर्ग अनुरोध संदर्भ (और HTTP संदर्भ) पर निर्भर करता है, उन संदर्भ वस्तुओं का निर्माण मैन्युअल रूप से अप्रत्याशित परिणाम प्राप्त कर सकता है। यदि HttpContext.Current शून्य है और आप इस दृष्टिकोण का उपयोग करते हैं, तो मैं सावधानी के साथ आगे बढ़ूंगा।
शॉन

4
इस उत्तर से सावधान रहें - डंबलाइड रिक्वेस्ट कॉन्टेक्स्ट का परिणाम उरल हेल्पर है जो हमेशा खाली स्ट्रिंग देता है।
३०'१६

47

निम्न के साथ एक कंट्रोलर कार्रवाई के भीतर एक UrlHelper का निर्माण किया जा सकता है:

 var url = new UrlHelper(this.ControllerContext.RequestContext);
 url.Action(...);

कंट्रोलर के बाहर, रूटटेबल से एक RequestContext बनाकर UrlHelper का निर्माण किया जा सकता है।

HttpContextWrapper httpContextWrapper = new HttpContextWrapper(System.Web.HttpContext.Current);
UrlHelper urlHelper = new UrlHelper(new RequestContext(httpContextWrapper, RouteTable.Routes.GetRouteData(httpContextWrapper)));

(एक मामूली कोड सुधार के साथ ब्रायन के उत्तर के आधार पर)


2
लेकिन मेरे पास मॉडल में कोई नियंत्रक नहीं है।
पुतीनो

ठीक है मैं माफी माँगता हूँ, मुझे यकीन नहीं था कि जहां कोड निष्पादित किया जा रहा था। मुझे एक नज़र रखना ...
नाथन टेलर

2
नया अनुरोध संदर्भ बनाने की आवश्यकता नहीं है:var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
bradlis7

अच्छा @ bradlis7 क्या वह MVC 5 है?
नाथन टेलर

1
काम नहीं करता है, क्योंकि this.ControllerContext.RequestContextएक HttpRequestContextकी UrlHelperउम्मीद है , और एक के निर्माता RequestContext। दोनों वर्ग असंबंधित हैं।
फ्लोरियन विंटर

8

हां, आप इसे इंस्टेंट कर सकते हैं। आप कुछ ऐसा कर सकते हैं:

var ctx = new HttpContextWrapper(HttpContext.Current);
UrlHelper helper = new UrlHelper(
   new RequestContext(ctx,
   RouteTable.Routes.GetRouteData(ctx));

RouteTable.Routesएक स्थिर संपत्ति है, इसलिए आपको वहां ठीक होना चाहिए; एक HttpContextBaseसंदर्भ प्राप्त करने के लिए, एक संदर्भ HttpContextWrapperलेता है HttpContextऔर इसे HttpContextवितरित करता है।


यह काम नहीं करेगा, हालांकि यह बहुत करीब है। नीचे मेरा जवाब देखें।
नाथन टेलर

3

अन्य सभी उत्तरों की कोशिश करने के बाद, मैं समाप्त हो गया

$"/api/Things/Action/{id}"

नफरत करने वाले नफरत करते हैं ers \ _ (ツ) _ / ¯


0

मैं एक पृष्ठ के भीतर (एक नियंत्रक के बाहर) से ऐसा ही कुछ करने की कोशिश कर रहा था।

अर्लहेल्पर ने मुझे आसानी से पाब्लोस के उत्तर के रूप में इसका निर्माण करने की अनुमति नहीं दी, लेकिन फिर मुझे वही काम करने के लिए एक पुरानी चाल याद आई:

string ResolveUrl(string pathWithTilde)

-30

मुझे लगता है कि आप जो खोज रहे हैं वह यह है:

Url.Action("ActionName", "ControllerName");
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.