আমি কীভাবে এএসপি.নেট এমভিসিতে কোনও ক্রিয়াটির সম্পূর্ণ url পাই?


239

আমাকে এরকম কিছু করতে হবে:

<script type="text/javascript">
    token_url = "http://example.com/your_token_url";
</script>

আমি এমভিসির বিটা সংস্করণটি ব্যবহার করছি, তবে কীভাবে কোনও ক্রিয়াটির নিখুঁত url পাওয়া যায় তা আমি বুঝতে পারি না। আমি এরকম কিছু করতে চাই:

<%= Url.AbsoluteAction("Action","Controller")) %>

এর জন্য কি কোনও সহায়ক বা পৃষ্ঠা পদ্ধতি আছে?

উত্তর:


480

ক্লিক করুন এখানে আরও তথ্যের জন্য, কিন্তু esentially এক্সটেনশন পদ্ধতি জন্য কোন প্রয়োজন নেই। এটি ইতিমধ্যে বেকড হয়েছে, খুব স্বজ্ঞাত উপায়ে নয়।

Url.Action("Action", null, null, Request.Url.Scheme);

6
আকর্ষণীয়, সুতরাং যদি আপনি প্রোটোকলটি নির্দিষ্ট করেন তবে ইউআরএল নিখুঁত
কেসব্যাশ

24
এই উত্তরটি আরও উত্তম, এইভাবে পুনঃভাগকারী এখনও অ্যাকশন এবং নিয়ামক বিদ্যমান তা যাচাই করতে পারে। আমি অনুরোধটি ব্যবহার করার পরামর্শ দেব http আরআরএল.স্কিমের পরিবর্তে HTTP, সেই ভাবে HTTP এবং https উভয়ই সমর্থিত।
পিবিরকফ

2
@ পিবিরকফ, সম্মত হন যে এটিই সেরা উত্তর তবে আপনি প্যারামিটারগুলি ক্রিয়া / নিয়ন্ত্রণকারীকে উপস্থাপন করে তা জানতে আপনি রিশার্পারের জন্য আপনার নিজস্ব পদ্ধতিগুলি বর্নিত করতে পারবেন তা জানতে আগ্রহী। এইভাবে আর # আপনার সরবরাহ করা স্ট্রিংগুলি এখনও বৈধ করতে পারে, যেমন এটি ভাল করে।
ড্র নোকস

3
একটি ছোট উন্নতি হতে পারে "HTTP" এর সাথে প্রতিস্থাপন করা Request.Url.Schemeযাতে আপনি এইচটিটিপিএস ব্যবহার করেন তবে উত্পন্ন ইউআরএলও এইচটিটিপিএস ব্যবহার করবে।
এরিক শিয়েরবুম

1
এটি Html.ActionLinkপাশাপাশি কাজ করে (উদাহরণস্বরূপ এমভিসি 4 তে শেষ 2 টি পদ্ধতি)
ক্রিস

74

উরলহেল্পার প্রসারিত করুন

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this UrlHelper url, string action, string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

তারপরে এটিকে কল করুন

<%= Url.AbsoluteAction("Dashboard", "Account")%>

সম্পাদনা করুন - পুনর্বার লিখিতকরণগুলি

গৃহীত উত্তরের উপর সর্বাধিক আপত্তিজনক মন্তব্যটি হ'ল This answer is the better one, this way Resharper can still validate that the Action and Controller exists.তাই আপনি কীভাবে একই আচরণ পেতে পারেন তার একটি উদাহরণ এখানে।

using JetBrains.Annotations

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(
            this UrlHelper url,
            [AspMvcAction]
            string action,
            [AspMvcController]
            string controller)
        {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;

            string absoluteAction = string.Format(
                "{0}://{1}{2}",
                requestUrl.Scheme,
                requestUrl.Authority,
                url.Action(action, controller));

            return absoluteAction;
        }
    }
}

সহায়ক তথ্য:


3
আমি এই সমাধানের জন্য alচ্ছিক পরামিতিগুলি যুক্ত করব। এটি সমস্ত ক্ষেত্রে কভার করা উচিত।
ইউজিনিউ টোরিকা

খুব সুন্দর! আমি এই কোডটি ব্যবহার করেছি তবে আমি একমাত্র যুক্তিটি আপেক্ষিক ইউআরএল তৈরি করেছি যাতে কলার তাদের পছন্দমতো url পদ্ধতি (রাউটারের মান ইত্যাদি) ব্যবহার করে এটি তৈরি করতে পারে এবং আপনার পদ্ধতিটি এটিকে আপেক্ষিক করার জন্য কেবল দায়বদ্ধ হতে পারে। সুতরাং আমার এটি: AbsolveUrl (এই UrlHelper url, স্ট্রিং আপেক্ষিক ইউআরএল)।
রব কেন্ট


21

গাইডলিনের উত্তর হিসাবে @ চার্লিনোর জবাবটি ব্যবহার করে আমি এটি নিয়ে এসেছি।

UrlHelper জন্য ASP.NET MVC ডকুমেন্টেশন অনুষ্ঠান Url.Action একটি সম্পূর্ণ যোগ্য URL ফিরে আসবে যদি একটি হোস্ট নাম ও প্রোটোকল পাস করছে। আমি হোস্ট-নেম ও প্রোটোকল বলপূর্বক এই সাহায্যকারী নির্মিত প্রদান করা। একাধিক ওভারলোডগুলি url.Action- এর জন্য ওভারলোডগুলি মিরর করে:

using System.Web.Routing;

namespace System.Web.Mvc {
    public static class HtmlExtensions {

        public static string AbsoluteAction(this UrlHelper url, string actionName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, new RouteValueDictionary(routeValues), 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, null, routeValues, requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, (RouteValueDictionary)null, 
                              requestUrl.Scheme, null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            object routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, 
                                            RouteValueDictionary routeValues) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, routeValues, requestUrl.Scheme, 
                              null);
        }

        public static string AbsoluteAction(this UrlHelper url, string actionName, 
                                            string controllerName, object routeValues, 
                                            string protocol) {
            Uri requestUrl = url.RequestContext.HttpContext.Request.Url;
            return url.Action(actionName, controllerName, 
                              new RouteValueDictionary(routeValues), protocol, null);
        }

    }
}

4
কোডটির জন্য থেক্স, আমাকে অনেক সাহায্য করেছিল, তবে এই সমাধানটিতে একটি সমস্যা রয়েছে যা সাধারণত বিকাশের সময় আসে। যদি সাইটটি একটি নির্দিষ্ট পোর্টে হোস্ট করা হয় তবে পোর্টের তথ্যটি অনুরোধ ইউআরএল-অনুমোদিত মধ্যে অন্তর্ভুক্ত করা হয়েছে , লোকালহোস্টের মতো : 4423 । কোনও কারণে অ্যাকশন পদ্ধতিটি আবার বন্দর যুক্ত করে। সুতরাং হয় এটি অ্যাকশন পদ্ধতির ভিতরে একটি বাগ বা আপনার এখানে বন্দর সরবরাহ করার কথা নয়। তবে অনুরোধে উপলভ্য বৈশিষ্ট্যগুলির মধ্যে কোনটি সঠিক এটি (ডিএনএসএফএফ হোস্ট বা হোস্ট)? সমাধানটি বরং সহজ: কেবল নাল সরবরাহ করুন এবং অ্যাকশন পদ্ধতিটি সঠিক মান পূরণ করবে।
ntziolis

আমি @ ntziolis এর পরামর্শ অন্তর্ভুক্ত করার জন্য উত্তর আপডেট করেছি।
অ্যান্ড্রু আর্নট

3

এটি করার মতো কোনও বিল্ট তৈরি আছে কিনা তা আমি নিশ্চিত নই, তবে আপনি নিজের এইচটিএমএলহেল্পার পদ্ধতিটি রোল করতে পারেন।

নীচের মত কিছু

namespace System.Web.Mvc
{
    public static class HtmlExtensions
    {
        public static string AbsoluteAction(this HtmlHelper html, string actionUrl)
        {
            Uri requestUrl = html.ViewContext.HttpContext.Request.Url;

            string absoluteAction = string.Format("{0}://{1}{2}",
                                                  requestUrl.Scheme,
                                                  requestUrl.Authority,
                                                  actionUrl);

            return absoluteAction;
        }
    }
}

তারপরে এটিকে কল করুন

<%= Html.AbsoluteAction(Url.Action("Dashboard", "Account"))%> »

এইচটিএইচ, চার্লস


2

যুক্তি সহ সম্পূর্ণ উত্তর হবে:

var url = Url.Action("ActionName", "ControllerName", new { id = "arg_value" }, Request.Url.Scheme);

এবং এটি একটি পরম ইউআরএল তৈরি করবে will


1

একই ফলাফল তবে কিছুটা পরিষ্কার

public static Uri GetBaseUrl(this UrlHelper url)
{
    Uri contextUri = new Uri(url.RequestContext.HttpContext.Request.Url, url.RequestContext.HttpContext.Request.RawUrl);
    UriBuilder realmUri = new UriBuilder(contextUri) { Path = url.RequestContext.HttpContext.Request.ApplicationPath, Query = null, Fragment = null };
    return realmUri.Uri;
}

public static string ActionAbsolute(this UrlHelper url, string actionName, string controllerName)
{
    return new Uri(GetBaseUrl(url), url.Action(actionName, controllerName)).AbsoluteUri;
}

0

হয়তো এই (?):

<%= 
  Request.Url.GetLeftPart(UriPartial.Authority) + 
  Url.Action("Action1", "Controller2", new {param1="bla", param2="blabla" })
%>

0

env: ডটনেট কোর সংস্করণ 1.0.4

Url.Action("Join",null, null,Context.Request.IsHttps?"https":"http");
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.