এএসপি.নেট এমভিসিতে মডেলগুলিতে আরলহেল্পারকে কল করুন


159

আমাকে এএসপি.নেট এমভিসি-র একটি মডেলটিতে কিছু URL তৈরি করতে হবে। আমি urlHelper.Action () এর মতো কিছু কল করতে চাই যা ইউআরএল তৈরির জন্য রুটগুলি ব্যবহার করে। হোস্ট-নেম, স্কিম ইত্যাদির মতো সাধারণ শূন্যস্থান পূরণ করতে আমার আপত্তি নেই।

আমি কি এর জন্য কল করতে পারি এমন কোন পদ্ধতি আছে? একটি আরলহেল্পার নির্মাণের উপায় আছে?


1
আমি নিজেই এ সম্পর্কে ভাবছিলাম, তবে সচেতন থাকবেন যে url.Action একটি আপেক্ষিক URL তৈরি করবে। আপনি যে চান তা নিশ্চিত হন।
ভিভিয়ান নদী

উত্তর:


277

সহায়ক টিপ, যে কোনও এএসপি.এনইটি অ্যাপ্লিকেশনটিতে, আপনি বর্তমান এইচটিপিপি কনটেক্সট এর একটি রেফারেন্স পেতে পারেন

HttpContext.Current

যা System.Web থেকে প্রাপ্ত। অতএব, নিম্নলিখিতটি কোনও এএসপি.নেট এমভিসি অ্যাপ্লিকেশনটিতে যে কোনও জায়গায় কাজ করবে:

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একটি তৈরি মাইমোডেল অবজেক্টে সম্পত্তি কল করা বৈশ্বিক.আসাক্সের রাউটিংয়ের উপর ভিত্তি করে মডেলটি দেখতে বৈধ ইউরালটি ফিরিয়ে দেবে


আপনি কি নিশ্চিত যে কোনও এইচটিপিপেক্সটেক্সট.কেনার্ট.রেকুয়েস্ট.রেকুয়েস্টকন্টেক্সট আছে? HttpContext.Current.Request এর কাছে একটি অনুরোধকন্টেক্সট নেই বলে মনে হচ্ছে।
pupeno

1
অদ্ভুত জিনিস. আমি কেবল এই সমাধানটি পরীক্ষা করে দেখেছি এবং এটি পুরোপুরি কার্যকর হয় works আমি এএসপি.নেট এমভিসি 2 প্রিভিউ 2 চালাচ্ছি তবে আমি মনে করি এটি সমস্ত সংস্করণ জুড়ে কাজ করে। নিশ্চিত না কেন এটি আপনার পক্ষে কাজ করছে না। আপনি কি এমভিসি প্রকল্পের বাইরে ক্লাস তৈরি করছেন? এছাড়াও নিশ্চিত আছে usingউভয়ের জন্য System.WebএবংSystem.Web.Mvc
ওমর

আমি একটি এএসপি.এনইটি এমভিসি 1 প্রকল্পে আছি, আমি ইউএসিং মিস করার কথা ভেবেছিলাম তবে আমার কাছে দুটি আছে have
pupeno

কেন এটি প্রদর্শিত হচ্ছে না তা নিশ্চিত নয়। যদি অন্য কেউ নিশ্চিত করতে পারতেন যে এটিএসপি.নেট এমভিসি 1 তে বিদ্যমান নেই তবে এটি দুর্দান্ত। আমার কাছে কেবলমাত্র ভিএস 2010 এবং এমভিসি 2 ইনস্টল থাকা একটি মেশিন রয়েছে। আপনি যদি আগ্রহী হন, এমভিসি আরসি 2 হ্যাকড
ওমর

6
নোট করুন যে অনুরোধ। রেকোস্টকনটেক্স .NET4 +
এইচ - এন

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);

এটিতে আমার সাইটের ইউআরএল রয়েছে। সেখানে, আমি এটি সরিয়েছি।
pupeno

4
উরলহেল্পার শ্রেণি অনুরোধের প্রসঙ্গে (এবং এইচটিটিপি প্রসঙ্গ) উপর নির্ভর করে বিবেচনা করে, ম্যানুয়ালি সেই প্রসঙ্গের বিষয়গুলি তৈরি করা অপ্রত্যাশিত ফলাফল পেতে পারে। যদি এইচটিটিপি কনটেক্সট.কেন্দ্রটি নালাগুলি হয় এবং আপনি এই পদ্ধতির ব্যবহার করেন তবে আমি সাবধানতার সাথে এগিয়ে যাব।
শন

4
এই উত্তরটি থেকে সাবধান থাকুন - ডাম্মেড রিকোয়েস্ট কনটেক্সট এর ফলাফলটি একটি urlHelper এর ফলাফল দেয় যা সর্বদা খালি স্ট্রিং দেয়।
gknicker

47

নিম্নলিখিতটি দিয়ে একটি কন্ট্রোলার অ্যাকশনের মধ্যে থেকে একটি আরলহেল্পার তৈরি করা যেতে পারে:

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

কন্ট্রোলারের বাইরে, রুটবেল থেকে একটি অনুরোধকন্টেক্সট তৈরি করে একটি আরলহেল্পার তৈরি করা যায় Rou রুটডেটা রুট করুন ou

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

(ব্রায়ানের উত্তরের উপর ভিত্তি করে একটি ছোটখাটো কোড সংশোধন যুক্ত করা হয়েছে))


2
তবে মডেলটিতে আমার কোনও নিয়ামক নেই।
pupeno

ঠিক আছে আমি ক্ষমাপ্রার্থী, কোডটি কোথায় কার্যকর করা হচ্ছে তা আমি নিশ্চিত ছিলাম না। আমাকে একবার দেখে নেওয়া যাক ...
নাথন টেলর

2
নতুন অনুরোধের প্রসঙ্গ তৈরি করার দরকার নেই:var urlHelper = new UrlHelper(HttpContext.Current.Request.RequestContext);
ব্র্যাডলি 7

সুন্দর @ ব্র্যাডলিস 7। এটি কি এমভিসি 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}"

বিদ্বেষীরা hate \ _ (ツ) _ / hate ঘৃণা করবে ¯


0

আমি কোনও পৃষ্ঠার মধ্যে থেকে (নিয়ামকের বাইরে) অনুরূপ কিছু করার চেষ্টা করছিলাম।

আরলহেল্পার আমাকে পাব্লোসের উত্তরের মতো সহজেই এটি নির্মাণের অনুমতি দেয় নি, তবে তারপরে আমি একই জিনিস কার্যকর করার জন্য একটি পুরানো কৌশলটি স্মরণ করেছি:

string ResolveUrl(string pathWithTilde)

-30

আমি মনে করি আপনি যা খুঁজছেন তা হ'ল:

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