Membuat URL di controller .NET MVC

131

Saya harus dapat membuat tautan di Action pada controller untuk mengirim email. Apa praktik terbaik untuk melakukan ini? Saya tidak ingin membangunnya sendiri jika rute saya berubah.

Haruskah saya memiliki pandangan untuk setiap email dan memberikannya dan mengirimkannya? Itu mungkin cara yang baik untuk melakukannya.

ScottBelchak
sumber

Jawaban:

230

Jika Anda hanya ingin mendapatkan jalur ke tindakan tertentu, gunakan UrlHelper:

UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);

jika Anda ingin membuat hyperlink:

string link = HtmlHelper.GenerateLink(this.ControllerContext.RequestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

Intellisense akan memberi Anda arti dari masing-masing parameter.


Pembaruan dari komentar : controller sudah memiliki UrlHelper:

string url = this.Url.Action("About", "Home", null); 
Gidon
sumber
17
Tindak lanjut: Untuk parameter kedua hingga terakhir (the RouteValueDictionary) di sini adalah contoh: System.Web.Routing.RouteValueDictionary baru (new {id = 1})
Matthew M.
15
Anda tidak perlu membuat UrlHelper baru; ada properti .Url pada controller yang akan memberi Anda satu dengan RequestContext yang benar.
Tobias J
Dari mana "Root" berasal? Jika saya harus menuliskan kode nama rute yang saya coba cocokkan, mengapa tidak mencantumkan kode url saja?
xr280xr
@ xr280xr: Saya percaya pada contoh ini "Root" adalah nama rute sebagaimana didefinisikan dalam metode RegisterRoutes (biasanya dalam RouteConfig). Bagi saya, itu "Default" (seperti ketika saya membuat proyek saya).
Andy
3
Anda tidak perlu membuat UrlHelper, cukup akses properti Url di kelas Controller.
Jay Douglass
22

Jika Anda memerlukan url lengkap (misalnya untuk mengirim melalui email) pertimbangkan untuk menggunakan salah satu metode bawaan berikut:

Dengan ini, Anda membuat rute yang akan digunakan untuk membangun url:

Url.RouteUrl("OpinionByCompany", new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}), HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Di sini url dibangun setelah mesin rute menentukan yang benar:

Url.Action("Detail","Opinion",new RouteValueDictionary(new{cid=newop.CompanyID,oid=newop.ID}),HttpContext.Request.Url.Scheme, HttpContext.Request.Url.Authority)

Dalam kedua metode, 2 parameter terakhir menentukan protokol dan nama host.

Salam.

andresfiuba
sumber
7
Penggunaan FYI Url.Action(action, controller, routevalue, protocol)juga menghasilkan URL lengkap, jadi Anda tidak perlu menentukan nama host jika tidak perlu.
Endy Tjahjono
1
Saya mendapatkan URL berikut dengan nomor port berlipat ganda, bagaimana cara memperbaikinya? http: // localhost: 54383: 54383 / MyArea / MyController / Details / 1
Patee Gutee
12

Saya memiliki masalah yang sama, dan tampaknya jawaban Gidon memiliki satu cacat kecil: menghasilkan URL relatif, yang tidak dapat dikirim melalui pos.

Solusi saya terlihat seperti ini:

string link = HttpContext.Request.Url.Scheme + "://" + HttpContext.Request.Url.Authority + Url.Action("ResetPassword", "Account", new { key = randomString });

Dengan cara ini, URL lengkap dihasilkan, dan berfungsi meskipun aplikasi beberapa level di dalam server hosting, dan menggunakan port selain 80.

EDIT: Saya menemukan ini berguna juga.

Moshe
sumber
Harap dicatat bahwa ini memiliki kerentanan keamanan utama. Yang diperlukan hanyalah seseorang yang memodifikasi tajuk permintaan untuk memuat URL jahat sebagai tuan rumah dan aplikasi Anda akan mengirim email resmi yang berisi tautan ke situs web berbahaya.
V0ldek
7

Cara lain untuk membuat URL absolut untuk suatu tindakan:

var relativeUrl = Url.Action("MyAction");  //..or one of the other .Action() overloads
var currentUrl = Request.Url;

var absoluteUrl = new System.Uri(currentUrl, relativeUrl);
Sphinxxx
sumber
4

Saya tahu ini adalah pertanyaan lama, tetapi kalau-kalau Anda mencoba melakukan hal yang sama di ASP.NET Core, berikut adalah bagaimana Anda dapat membuat UrlHelper di dalam suatu tindakan:

var urlHelper = new UrlHelper(this.ControllerContext);

Atau, Anda bisa menggunakan Controller.Urlproperti jika Anda mewarisi dari Controller.

Darren
sumber