PDA

View Full Version : سوال: ذخیره محتوای Data reader در یک آرایه جاوااسکریپتی



sara_mp
سه شنبه 17 آبان 1390, 13:50 عصر
سلام
من یه آرایه در جاوا اسکریپت دارم و میخام محتوای اون رو با استفاده از یه data reader پر کنم اگه راهنمایی کنید یا یه مثال بزنید ممنون میشم .

Reza798
سه شنبه 17 آبان 1390, 14:06 عصر
سلام
من یه آرایه در جاوا اسکریپت دارم و میخام محتوای اون رو با استفاده از یه data reader پر کنم اگه راهنمایی کنید یا یه مثال بزنید ممنون میشم .

سلام

شما ابتدا خروجی DataReader را به لیست تبدیل کنید و سپس مانند کد زیر آنرا به javascript صفحه اضافه کنید :



List<string> tempString = new List<string>();
tempString.Add("Hello");
tempString.Add("World");

StringBuilder sb = new StringBuilder();
sb.Append("<script>");
sb.Append("var testArray = new Array;");
foreach(string str in tempString)
{
sb.Append("testArray.push('" + str + "');");
}
sb.Append("</script>");

ClientScript.RegisterStartupScript(this.GetType(), "TestArrayScript", sb.ToString());

mehdi.mousavi
سه شنبه 17 آبان 1390, 17:12 عصر
سلام شما ابتدا خروجی DataReader را به لیست تبدیل کنید و سپس مانند کد زیر آنرا به javascript صفحه اضافه کنید

سلام.
پاسخ شما تا حدی درست هستش، اما میشه اونو Refactor کرد و به شکل و شمایل بهتری نوشت. در مرحله اول، می تونید با اضافه کردن پارامتر true به متود RegisterStartupScript از این متود بخواهیم تا بلاک script رو خودش اضافه کنه (جای اینکه در کد خودمون اینکارو انجام بدیم). بنابراین، کد شما به کد زیر تغییر خواهد کرد:


List<string> tempString = new List<string>();
tempString.Add("Hello");
tempString.Add("World");

StringBuilder sb = new StringBuilder();
sb.Append("var testArray = new Array;");
foreach (string str in tempString)
sb.Append("testArray.push('" + str + "');");

ClientScript.RegisterStartupScript(this.GetType(), "TestArrayScript2", sb.ToString(), true);

خروجی حاصل از این کد، ارسال رشته زیر به Client خواهد بود:

<script>var testArray = new Array;testArray.push('Hello');testArray.push('Worl d');</script>

اما این کد، کد جالبی نیست. اگر تعداد Element های خوانده شده از DataReader زیاد باشه، اونوقت کد تولید شده برای ایجاد این آرایه بسیار تکراری و زیاد خواهد بود. در نتیجه، بهتره کدمون رو به شکل زیر تغییر بدیم تا خروجی جمع و جورتری تولید بشه:


List<string> tempString = new List<string>();
tempString.Add("Hello");
tempString.Add("World");

StringBuilder sb = new StringBuilder();
sb.Append("var testArray = [");
foreach (string str in tempString)
sb.Append("'" + str + "', ");
sb.Remove(sb.Length - 2, 2).Append("];");

ClientScript.RegisterStartupScript(this.GetType(), "TestArrayScript2", sb.ToString(), true);


که باعث تولید آرایه ای، البته با شکل و شمایل زیر سمت Client میشه:

var testArray = ['Hello', 'World'];

اما هنوز (حداقل) دو گام تا بهتر نوشتن این کد داریم. کلاس ClientScript، تابعی داره به اسم RegisterArrayDeclaration که امکان ثبت یک آرایه در Client-Side رو میده. در نتیجه، کد فوق رو میتونیم بدین شکل تغییر بدیم:

List<string> tempString = new List<string>();
tempString.Add("Hello");
tempString.Add("World");

StringBuilder sb = new StringBuilder();
foreach (string str in tempString)
sb.AppendFormat("'{0}', ", str);

ClientScript.RegisterArrayDeclaration("testArray", sb.Remove(sb.Length - 2, 2).ToString());

که خروجی تابع فوق عبارت است از:

<script type="text/javascript">
//<![CDATA[
var testArray = new Array('Hello', 'World');
//]]>
</script>

اما عرض کردم دو گام! گام دوم چیه؟ Escape کردن صحیح کاراکترهای ' (و بطور کلی المنتهای آرایه) تا مشکلی در سمت Client پیش نیاد (فرض کنید جای Hello عبارت isn't بود!).

موفق باشید.