ورود

View Full Version : Url.Action در Application_Start



resident
شنبه 01 دی 1397, 22:37 عصر
سلام.
من تو Application_Start یه تایمر گذاشتم. داخلش میخوام از Url.Action استفاده کنم که متاسفانه نمیشه.
کسی می تونه کمک کنه؟

مهدی کرامتی
یک شنبه 02 دی 1397, 13:53 عصر
سلام

اگر فقط به مسیر یک اکشن در یک کنترلر نیاز دارید می توانید از این کد استفاده کنید:
UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);
اما اگر نیاز دارید یک تگ لینک کامل بسازید کد شما اینگونه خواهد بود:
string link = HtmlHelper.GenerateLink(this.ControllerContext.Req uestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);

resident
دوشنبه 03 دی 1397, 15:06 عصر
سلام

اگر فقط به مسیر یک اکشن در یک کنترلر نیاز دارید می توانید از این کد استفاده کنید:
UrlHelper u = new UrlHelper(this.ControllerContext.RequestContext);
string url = u.Action("About", "Home", null);
اما اگر نیاز دارید یک تگ لینک کامل بسازید کد شما اینگونه خواهد بود:
string link = HtmlHelper.GenerateLink(this.ControllerContext.Req uestContext, System.Web.Routing.RouteTable.Routes, "My link", "Root", "About", "Home", null, null);
ممنون بابت وقتی که گذاشتین

در هر دو کد مشکل سر ControllerContext.RequestContext هست. خطای زیر رو میده:

'MvcApplication' does not contain a definition for 'ControllerContext' and no extension method 'ControllerContext' accepting a first argument of type 'MvcApplication' could be found (are you missing a using directive or an assembly reference?)


وقتی هم this رو از this.ControllerContext.RequestContext برمیدارم خطای زیر رو میده:

An object reference is required for the non-static field, method, or property 'ControllerContext.RequestContext'

مهدی کرامتی
چهارشنبه 05 دی 1397, 12:17 عصر
با عرض پوزش. من دقت نکرده بودم جایی که میخواهید متد را فرخوانی کنید یک کنترلر نیست.

برای اینکه متدی برای حل مسئله تان داشته باشید که همه جا قابل فرخوانی باشد یک کلاس برایتان ساختم بنام Utils:
using System.Web;
using System.Web.Mvc;

namespace WebApplication3
{
public class Utils
{
public static string GetActionUrl(string action, string controller, object idParam,bool generateFullUrl = false)
{
var request = HttpContext.Current.Request;
string url = new UrlHelper(request.RequestContext).Action(action, controller,new {id = idParam });
if (generateFullUrl)
{
url = $"{request.Url.Scheme}://{request.Url.Authority}{url}";
}
return url;
}
}
}
نحوه فرخوانی به صورت عادی:
string url = Utils.GetActionUrl("Contact", "Home", null);
و اگر می خواهید در آدرسی که این متد باز می گرداند پروتکل (https یا http) و نیز آدرس سایت باشد متد فوق را به این صورت فراخوانی کنید:
string url = Utils.GetActionUrl("Contact", "Home", null,true);

resident
چهارشنبه 05 دی 1397, 16:14 عصر
با عرض پوزش. من دقت نکرده بودم جایی که میخواهید متد را فرخوانی کنید یک کنترلر نیست.

برای اینکه متدی برای حل مسئله تان داشته باشید که همه جا قابل فرخوانی باشد یک کلاس برایتان ساختم بنام Utils:
using System.Web;
using System.Web.Mvc;

namespace WebApplication3
{
public class Utils
{
public static string GetActionUrl(string action, string controller, object idParam,bool generateFullUrl = false)
{
var request = HttpContext.Current.Request;
string url = new UrlHelper(request.RequestContext).Action(action, controller,new {id = idParam });
if (generateFullUrl)
{
url = $"{request.Url.Scheme}://{request.Url.Authority}{url}";
}
return url;
}
}
}
نحوه فرخوانی به صورت عادی:
string url = Utils.GetActionUrl("Contact", "Home", null);
و اگر می خواهید در آدرسی که این متد باز می گرداند پروتکل (https یا http) و نیز آدرس سایت باشد متد فوق را به این صورت فراخوانی کنید:
string url = Utils.GetActionUrl("Contact", "Home", null,true);

سپاس بابت وقتی که گذاشتین...

کد زیر null بر می گردونه:
HttpContext.Current.Request

tileiran
چهارشنبه 05 دی 1397, 16:24 عصر
تشکر بابت انجمن خوبتون

مهدی کرامتی
جمعه 07 دی 1397, 11:08 صبح
کد زیر null بر می گردونه
کجا فراخوانی اش کردید که null برگرداند؟
در پروژه های وب، معمولا چون برنامه به ازای Request های دریافتی اجرا میشه عملا هیچ وقت نباید اون HttpContext.Current.Request باشه.

resident
دوشنبه 10 دی 1397, 17:32 عصر
کجا فراخوانی اش کردید که null برگرداند؟
در پروژه های وب، معمولا چون برنامه به ازای Request های دریافتی اجرا میشه عملا هیچ وقت نباید اون HttpContext.Current.Request باشه.


protected void Application_Start()
{

timer = new System.Timers.Timer();
timer.Enabled = true;
timer.Interval = 60000;
timer.Start();
timer.Elapsed += HandleTimerElapsed;

}

public void HandleTimerElapsed(object sender, System.Timers.ElapsedEventArgs e)
{
if(...){
// create Link using url.action or ...
}
}





در HandleTimerElapsed میخوام از @Url.Action یا کد مشابهی استفاده کنم که url ام رو بسازم.

میلاد علوی
دوشنبه 10 دی 1397, 23:25 عصر
ای کاش به این تاپیک منم جواب می دادید
http://barnamenevis.org/showthread.php?553123-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%A8%D9%87-Local-storage-%D8%B3%D8%A7%DB%8C%D8%AA%DB%8C-%D8%AF%DB%8C%DA%AF%D8%B1

مهدی کرامتی
سه شنبه 11 دی 1397, 00:36 صبح
اولا رویداد Application_Start زمانی اجرا می شود که برنامه تازه می خواهد شروع به کار کند و بالطبع در لحظه شروع هنوز درخواستی به سوی برنامه ارسال نشده است.
ثانیا، Timer معمولا در یک Thread جدا از ASP.NET Worker Process اجرا می شود و از آنجاییکه این ترد بخشی از Http Pipeline محسوب نمی شود طبیعی است که Request/Response دسترسی نداشته باشد.

شما می خواهید دقیقا چکار کنید؟ هر 60 ثانیه یک بار یک لینک در کد ایجاد کنید؟

resident
سه شنبه 11 دی 1397, 19:26 عصر
اولا رویداد Application_Start زمانی اجرا می شود که برنامه تازه می خواهد شروع به کار کند و بالطبع در لحظه شروع هنوز درخواستی به سوی برنامه ارسال نشده است.
ثانیا، Timer معمولا در یک Thread جدا از ASP.NET Worker Process اجرا می شود و از آنجاییکه این ترد بخشی از Http Pipeline محسوب نمی شود طبیعی است که Request/Response دسترسی نداشته باشد.

شما می خواهید دقیقا چکار کنید؟ هر 60 ثانیه یک بار یک لینک در کد ایجاد کنید؟
ممنون بابت وقتی که گذاشتین و پاسخ دادین.
داخل برنامه ام، reminder دارم. کاربرها میتونن مشخص کنن که برنامه سر تاریخ و ساعت مشخصی، بهشون notification یا اس ام اس بده برای یادآوری.
هر 1 دقیقه یکبار چک می کنم اگر کاربری تو اون تاریخ و ساعت ، reminder ست کرده بود sms یا notification ارسال بشه.
وقتی notification ارسال میشه، میخوام لینک page مورد نظر رو هم ارسال کنم که با کلیک بر روی notification، صفحه مورد نظر نمایش داده بشه

مهدی کرامتی
جمعه 14 دی 1397, 19:00 عصر
این کار رو به راحتی با Hangfire می توانید انجام دهید. برای ساختن لینک هم اگر به آبجکت Request دسترسی نداشتید لزومی ندارد از کدهایی که بالاتر گذاشتم استفاده کنید، به راحتی آنها را به شکل یک استرینگ در کدتان قرار دهید.

echoob
پنج شنبه 05 اردیبهشت 1398, 11:37 صبح
واقعا ممنونم من بیشتر وقتایی که سوالی دارم یا گیر میکنم توی این انجمن میتونم جوا پیدا کنم یا جواب بگیرم

bekrdaneh
یک شنبه 08 اردیبهشت 1398, 21:57 عصر
ممنون لطف کردین موفق باشید

manavistone1
سه شنبه 10 اردیبهشت 1398, 11:40 صبح
منم همینجور خیلی راضیم از این انجمن

drmarjanhadad2
شنبه 14 اردیبهشت 1398, 20:30 عصر
خیلی ممنون از پاسخگوییتون

ehdasgostar
سه شنبه 17 اردیبهشت 1398, 10:40 صبح
متشکرم ازتون بسیار انجمن خوب و پرکاربردی دارید

kolahdoozan
جمعه 20 اردیبهشت 1398, 12:36 عصر
ممنون از پاسخگوییتون منم مشکل داشتم برطرف شد

armani1
سه شنبه 24 اردیبهشت 1398, 11:56 صبح
خیلی ممنون از پاسخگوییتون پایدار و موفق باشید

rahmatipoor
چهارشنبه 25 اردیبهشت 1398, 14:59 عصر
این دوست عزیز هر سری یک یوزر ایجاد می کنه و میاد اینجا یه نظر بی ربط میده تا به وب سایتی که توی پروفایلش ثبت کرده بک لینک بده

rahmatipoor
چهارشنبه 25 اردیبهشت 1398, 15:01 عصر
خیلی ممنون از پاسخگوییتون پایدار و موفق باشید


این دوست عزیز هر سری یک یوزر ایجاد می کنه و میاد اینجا یه نظر بی ربط میده تا به وب سایتی که توی پروفایلش ثبت کرده بک لینک بده