PDA

View Full Version : چگونگی انتقال اطلاعات در ROUTING ؟



alidaniyali
سه شنبه 04 بهمن 1390, 16:14 عصر
با سلام خدمت اساتید .

مشکلی که من باهاش مواجه شدم اینکه چجوری با استفاده از ROUTING انتقال اطلاعات بین صفحات کنم ؟

همونجوری که توی کوئری استرینگ استفاده می کنم ، می نویسم :

www.sitis.com/products/default.aspx?id=300

و با استفاده از Request.QueryString["ID"] ازش استفاده می کنیم .


در ROUTING که آدرس و به این شکل :

www.sitis.com/products/300

تغییر میدیم . چه جوری اون پارامتهای داخل URL و بخونیم .

توی ROUTING ما یک کلاس درست می کنیم . به طور مثال در زیر که من خودم ازش استفاده می کنم :


public class CustomRouteHandler : IRouteHandler
{
public string VirtualPath { get; private set; }

public CustomRouteHandler(string virtualPath,string ID)
{
this.VirtualPath = virtualPath;
}

public CustomRouteHandler()
{
}

public IHttpHandler GetHttpHandler(RequestContext requestContext)
{
var page = BuildManager.CreateInstanceFromVirtualPath(Virtual Path, typeof(Page)) as IHttpHandler;
return page;
}
}


فک کنم به تغییراتی باید توی این قسمت داده بشه ولی من درست متوجه قضیه نشدم !

ورژن برنامه من هم 3.5 است و از MVC استفاده نشده .
ممنون می شم از دوستان اگر راهنمایی کنند .

hamid_shrk
سه شنبه 04 بهمن 1390, 16:31 عصر
سلام :

Page.RouteData.Values["متغیر کوئری استرینک"].ToString()

alidaniyali
سه شنبه 04 بهمن 1390, 21:09 عصر
سلام :

Page.RouteData.Values["متغیر کوئری استرینک"].ToString()


شما مطمئین که این متد برای .net 3.5 ؟
چون RouteData نداره اصلا !

در ضمن من آدرس دهیم و توی global به این شکل دادم :


void Application_Start(object sender, EventArgs e)
{
RegisterRoutes(RouteTable.Routes);
}

public static void RegisterRoutes(RouteCollection routes)
{
routes.Add("News", new Route("News/{ID}/{NAME}", new CustomRouteHandler("~/Pages/News.aspx"));
}

hamid_shrk
چهارشنبه 05 بهمن 1390, 08:29 صبح
به این لینک یک سری بزنید :
http://msdn.microsoft.com/en-us/magazine/dd347546.aspx

alidaniyali
پنج شنبه 06 بهمن 1390, 09:28 صبح
ممنون .
من اینو دیدم مثل اونم عمل کردم . ولی هیچ پارامتری و پاس نمیده و توی RecipeRouteHandler تو این خط ارور میده :

display.RecipeName = requestContext.RouteData.Values["name"] as string;


این یه تیکه برنامه منو ببیند من چه جوری می تونم تو اون پیج دومم پارامترها رو انتقال بدم .

hamid_shrk
پنج شنبه 06 بهمن 1390, 09:48 صبح
مشکل از دستور شماست من پروژتون رو دیدم ؛تو این جالت میگیره مقدار رو :

if (requestContext.RouteData.Values["name"] != null)
{
string test = requestContext.RouteData.Values["name"] as string;

}

alidaniyali
پنج شنبه 06 بهمن 1390, 10:32 صبح
مشکل از دستور شماست من پروژتون رو دیدم ؛تو این جالت میگیره مقدار رو :

if (requestContext.RouteData.Values["name"] != null)
{
string test = requestContext.RouteData.Values["name"] as string;

}


ممنون
اینی که شما گذاشتیت درست ولی تو کلاس RecipeRouteHandler مقدار خروجی که تابع باید برگردونه از نوع IHttpHandler اینجا ما میریزیم تو string و در کل اون کلاس display با پارامتر RecipeName که از نوع string است هیچ نوع مقداری نمی گیره ارور Object reference میده !
بعد از این حالا توی صفحه دومم که اسم RecipeDisplay.aspx است چجوری این اطلاعات رو بخونم ؟

hamid_shrk
پنج شنبه 06 بهمن 1390, 10:50 صبح
شما کلا با این دستور میتونید مقدار رو بخونید و هرطوری که میخواید ازش استفاده کنید.
مشکل شما تو گرفتن مقدار کوئری استرینگ بود که با این دستور میگیره.
واقعیتش من نفهمیدم کدتون چیکار میکنه.

alidaniyali
پنج شنبه 06 بهمن 1390, 11:21 صبح
بینید
ما توی Global یه تابع به نام RegisterRoutes داریم . این تابع از سه قسمت تشکیل شده . قسمت اول یه نام براش انتخاب می کنیم . تو قسمت دوم آدرسی که می خوایم به اون شکل rewrite بشه نوشته می شه و قسمت سوم که آدرس فیزیکی یا همون واقعی باید از نوع IRouteHandler باشه . واسه همین یه کلاس تعریف کردیم این وسط به نام RecipeRouteHandler که اینهریت شده از IRouteHandler .


privatestaticvoid RegisterRoutes()
{
RouteTable.Routes.Add("Recipe", newRoute("recipe/{name}", new SampleRouting.Routing.RecipeRouteHandler("~/WebForms/RecipeDisplay.aspx")));
}




توی کلاس RecipeRouteHandler یه پراپرتی به نام RecipeRouteHandler داریم که آدرس فیزیکی ما رو میگیره . بعد با یه متد دیگه به نام GetHttpHandler که خروجی از نوع IHttpHandler بر می گردونه . وقتی توی این متد با استفاده از او کد شما


requestContext.RouteData.Values["name"]

مقدار خوانده شده از url درست ولی از یه کلاس واسط دیگه این وسط به نام IRecipeDisplay استفاده شده این کلاس هیچی نداره فقط یه پراپرتی از نوع string که مقدار همون value که ما می خواهیم و انتقال می ده . ولی اینجا توی مقدار دهی ارور object... میده . و قبول نمیکنه .

کلا اینجا یه دونه Default.aspx داریم و یه دونه RecipeDisplay.aspx که با لینکی که توی defaulte میخوایم به صفحه دوم بریم ولی مقدار که توی url هست هم مثل کوئری استرینگ انتقال پیدا کنده . اون موردی ام که شما فرمودید راجبه خواند :


test = requestContext.RouteData.Values["name"] asstring;


کاملا درست ولی توی توی صفحه دوم به requestContext دستری نداریم . تقریبا توی تمام مثال هایی که من از routing دیدم به همین شکل عمل کردن .

alidaniyali
پنج شنبه 06 بهمن 1390, 22:14 عصر
مشکلم حل شد :لبخند:

مشکل از اینجا بود که باید توی صفحه مقصد یه همچین چیزی داشته باشیم :


public System.Web.Routing.RouteData RouteData
{
get
{
return HttpContext.Current.Items["RouteData"] as System.Web.Routing.RouteData;
}
}


بعد اینجوری توی همون صفحه ازش استفاده می کنیم :


Response.Write(RouteData.Values["id"]);


اینم لینکش ، که روش Routing برای تغییر url به هر شکلی رو که بخواید ، بدون هیچ گونه پسوندی برای صفحات توی Asp.net 3.5 (بدون MVC) که خودم تست کردم کامل جواد میده :
http://www.cstruter.com/blog/276