ارسال TempData به اکشن


آموزش MVC –> جلسه اول –> قسمت نهم

در مقاله قبل ، نحوه ریدایرکت به اکشن بهمراه ارسال پارامتر را یاد گرفتیم . با توجه به سناریوی گفته شده در انتهای مقاله قبل(آموزش MVC –> جلسه اول –> قسمت هشتم) میخواهیم پارامتر های مختلفی را با نامهای گوناگون به اکشن مقصد بفرستیم . 

TempData  مانند Session در ASP.NET webform عمل میکند . در اکشن مبدا داریم :

 
public System.Web.Mvc.ActionResult Learn1180()
{
    TempData[“MyNumber”] = ۱۰;
    return (RedirectToAction(actionName: "Action4"));
}

در اکشن Learn1180 اکشن مقصد را با پارامتر MyNumber صدا زدیم و ریدایرکت شدیم . ممکن است در اکشنی دیگر (Learn1190 ) بخواهیم اکشن مقصد را با متغیر دیگری مانند MyName صدا بزنیم :

 
public System.Web.Mvc.ActionResult Learn1190()
{
    TempData[“MyName”] = "Ehsan Safari";
    return (RedirectToAction(actionName: "Action4"));
}

و در اکشن مقصد (Action4) پارامترهای فوق را بررسی میکنیم . اگر خالی نبودند آنرا چاپ میکنیم :

 
public System.Web.Mvc.ActionResult Action4()
{
    string strResult = string.Empty;
    if (TempData[“MyNumber”] != null)
    {
        int intMyNumber =
            System.Convert.ToInt32(TempData[“MyNumber”]);
        strResult =
            string.Format("My Number is {0}", intMyNumber);
    }
    if (TempData[“MyName”] != null)
    {
        string strMyName =
            TempData[“MyName”].ToString();
        strResult =
            string.Format("My Name is {0}", strMyName);
    }
    return (Content(strResult));
}

نکته : متغیر TempData عمر محدودی دارد یعنی مثلا متغیر MyNumber تا وقتی که خروجی به کاربر نمایش داده نشده است زنده می ماند ! بعد از آن null می شود .

نگهداری مقدار TempData توسط دستور Keep :

برای نگهداری مقدار قبلی tempdata از دستور keep استفاده میکنیم . برای روشن شدن مطلب به مثال زیر توجه کنید :

دو اکشن به نامهای Learn 1190 و Learn1200 داریم که در اولی از keep استفاده نکردیم :

 
public System.Web.Mvc.ContentResult Learn1190()
{
    if (TempData[“MyNumber”] == null)
    {
        TempData[“MyNumber”] = ۱۰;
    }
    else
    {
        TempData[“MyNumber”] =
            (int)TempData[“MyNumber”] + ۱;
    }
    return (Content(TempData[“MyNumber”].ToString()));
}

با هر بار refresh شدن صحه مروگر مقدار MyNumber برابر با null می شود و دوباره مقدار ۱۰ میگیرد . در اکشن دومی یعنی Learn1200 از دستور keep استفاده کرده ایم :

 
public System.Web.Mvc.ContentResult Learn1200()
{
    if (TempData[“MyNumber”] == null)
    {
        TempData[“MyNumber”] = ۱۰;
    }
    else
    {
        TempData[“MyNumber”] =
            (int)TempData[“MyNumber”] + ۱;
    }
    //TempData.Keep();
    TempData.Keep("MyNumber");
    return (Content(TempData[“MyNumber”].ToString()));
}

بنابراین با هر بار بارگذاری صفحه مقدار قبلی در MyNumber می ماند و هر بار یکواحد به مقدار قبلیش اضافه می شود .

 نکته : می توان بعنوان مثال یک متغیر بنام age در اکشنی تعریف کنیم و آنرا keep کنیم و در اکشن دیگری از آن استفاده کنیم . به مثال زیر توجه کنید :

در اکشن Learn1210 متغیر age  را  در TempData تعریف کرده و آنرا keep میکنیم :

 
public System.Web.Mvc.ContentResult Learn1210()
{
    TempData[“Age”] = ۱۰;
    TempData.Keep("Age");
        return (Content(TempData[“Age”].ToString()));
}

و در اکشن دوم Learn1220 آن متغیر نگهداری شده یعنی Age را چاپ میکنیم :

 
public System.Web.Mvc.ContentResult Learn1220()
{
    if (TempData[“Age”] == null)
    {
        return (Content("Undefined!"));
    }
    else
    {
        return (Content(TempData[“Age”].ToString()));
    }
}

در بار اولی که این اکشن اجرا می شود شرط if برابر false است و اجرا نمیشود و به else  میرود . در بار دوم به بعد چون آن متغیر را keep نکرده ایم مقدارش null میشود و شرط if برابر true میشود . برای کسب اطلاعات بیشتر به وب سایت asp.net مراجعه شود .

در مقاله بعد ، با پروتکلهای مهم Get و Post آشنا می شویم . همراه ما باشید …wink



دیدگاه ها :