PDA

View Full Version : سوال: عملکرد Eval() و Bind() و <% #%> چیست؟



mehran63
پنج شنبه 26 بهمن 1391, 11:34 صبح
سلام
کدها زیر را در نظر بگیرید


<asp:Label ID="Label2" runat="server" Text='<%# Eval("CompanyName") %>'></asp:Label>


<asp:TextBox Runat="server" ID="TheNotes"
Text='<%# Bind("notes") %>' />

1- Eval() و Bind() چه کاری انجام میدهند؟ اگر به هم مربوطند چه فرقی با هم دارند؟
2- <% #%> این شکل دستوری مربوط به ASP.NET است یا HTML؟ و چه موقعی استفاده میشود؟

malloc
پنج شنبه 26 بهمن 1391, 20:00 عصر
من هم حدودی جواب این سوال و میدونم اما چون دقیق نمیدونم و دوست دارم یاد بگیرم پست گذاشتم که دوباره این تاپیک مطرح بشه و ایشالا یکی از دوستان جواب بده

اوبالیت به بو
پنج شنبه 26 بهمن 1391, 20:20 عصر
2- <% #%> این شکل دستوری مربوط به ASP.NET است یا HTML؟ و چه موقعی استفاده میشود؟
درود بر شما

اگر در لابه لای تگ های HTML بخواید کدهای مربوط به بخش Server Side رو بنویسید از تگ <%# استفاده می کنید

babak2000
پنج شنبه 26 بهمن 1391, 21:31 عصر
Eval یک طرفه است ولی Bind دو طرفه یعنی علاوه بر نمایش میتونید ویرایش و ثبت کنید اما Eval فقط خواندنی ایست (Read Only)

http://msdn.microsoft.com/en-us/library/ms178366.aspx

saeed31641
پنج شنبه 26 بهمن 1391, 21:32 عصر
eval فقط از بانک میخونه
bind هم میخونه و هم مینویسه
http://weblogs.asp.net/leftslipper/archive/2007/06/29/how-asp-net-databinding-deals-with-eval-and-bind-statements.aspx
http://msdn.microsoft.com/en-us/library/ms178366.aspx

mehran63
جمعه 27 بهمن 1391, 12:12 عصر
درود بر شما

اگر در لابه لای تگ های HTML بخواید کدهای مربوط به بخش Server Side رو بنویسید از تگ <%# استفاده می کنید

1- اگر توضیح بیشتری با مثال بزنید عالی است.
2- کد زیر از <% =%> استفاده کرده اگر توجه کنید # ندارد و = هم دارد، این چه فرقی داره با <% #%> و در چه موقعی استفاده میشود؟

<h1><%= PageHeadingTitle%></h1>

saeed31641
جمعه 27 بهمن 1391, 12:41 عصر
<% =%>مثل RTSPONSE.WRITE عمی میکنه
# databinding می تونی صدا بزنی
http://stackoverflow.com/questions/12143613/difference-between-and-in-asp-net
http://stackoverflow.com/questions/1393819/what-is-the-difference-between-and-in-asp-net-mvc
http://stackoverflow.com/search?q=The+difference+between+%3C%25%3D+and+%3C% 25%23+in+ASP.NET

'جنود'
جمعه 27 بهمن 1391, 19:58 عصر
با یک نمونه کد موضوع را می شکافیم


</tr> <tr> <td align=right> <b>Last Name:</b> </td> <td> <asp:TextBox ID="EditLastNameTextBox" RunAt="Server" Text='<%# Bind("LastName") %>' /> </td> </tr>


همونطور که می بینید چون نیاز به تغییر محتویات TextBox هست با Bind کار کردیم




<tr> <td align="right"><b>Product Name:</b></td> <td><%# Eval("ProductName") %></td> </tr>




ولی اینجا نیازی به تغییر نیست چون متن درون <td> تغییر نمی کنه پس از Eval استفاده کردیم.

پاینده باشید

mehran63
یک شنبه 29 بهمن 1391, 21:30 عصر
با یک نمونه کد موضوع را می شکافیم


</tr> <tr> <td align=right> <b>Last Name:</b> </td> <td> <asp:TextBox ID="EditLastNameTextBox" RunAt="Server" Text='<%# Bind("LastName") %>' /> </td> </tr>


همونطور که می بینید چون نیاز به تغییر محتویات TextBox هست با Bind کار کردیم




<tr> <td align="right"><b>Product Name:</b></td> <td><%# Eval("ProductName") %></td> </tr>




ولی اینجا نیازی به تغییر نیست چون متن درون <td> تغییر نمی کنه پس از Eval استفاده کردیم.

پاینده باشید

1- اگر منظورتان را درست متوجه شده باشم در بعضی از کنترلها مثل TextBox نمیتوان از دستور Eval استفاده کرد و باید از Bind استفاده کرد و در برخی از کنترلها مانند Label باید از Eval استفاده کرد و از Bind نمیتوان استفاده کرد
2- در مورد مطلب زیر هم اگر راهنمایی کنید ممنون میشوم



2- کد زیر از <% =%> استفاده کرده اگر توجه کنید # ندارد و = هم دارد، این چه فرقی داره با <% #%> و در چه موقعی استفاده میشود؟

<h1><%= PageHeadingTitle%></h1>

mehran63
دوشنبه 30 بهمن 1391, 17:34 عصر
کسی راه حل نداره

zhr.rezae66i
دوشنبه 30 بهمن 1391, 17:53 عصر
اینهمه جواب
خب ی جوابم یکی به سواله من بده:افسرده:

mehran63
جمعه 04 اسفند 1391, 19:04 عصر
کسی راه حل نداره

atarodi
جمعه 04 اسفند 1391, 20:46 عصر
1- اگر منظورتان را درست متوجه شده باشم در بعضی از کنترلها مثل TextBox نمیتوان از دستور Eval استفاده کرد و باید از Bind استفاده کرد و در برخی از کنترلها مانند Label باید از Eval استفاده کرد و از Bind نمیتوان استفاده کرد
2- در مورد مطلب زیر هم اگر راهنمایی کنید ممنون میشوم

نه نشون می ده هنوز نگرفتی چی شد. در مورد textbox هم می تونی از eval استفاده کنی. اما تو این حالت امکان ویرایش کردن وجود نداره فقط نمایش می ده و اگه می خوای محتویات دیتابیس رو که توی این textbox اومده رو ویرایش کنی باید حتما از bind استفاده کنی. ولی در label چه از eval چه از bind استفاده کنی اصلا امکان ویرایش اطلاعات وجود نداره. چون عملکرد label فقط نمایش است.


اما در مورد سوال دومتون وقتی می خوای اطلاعاتت رو با کمک کنترلهایی مثل textbox و label نمایش بدی باید حتما eval و bind استفاده کنی. اما اگه نمی خوای اونا رو داخل این کنترلها قرار بدی از روش %=% استفاده می کنی.

clover
جمعه 04 اسفند 1391, 21:19 عصر
اینهمه جواب
خب ی جوابم یکی به سواله من بده

کدوم سوال؟


کد زیر از <% =%> استفاده کرده اگر توجه کنید # ندارد و = هم دارد، این چه فرقی داره با <% #%> و در چه موقعی استفاده میشود؟
به این مثال دقت کنید:


<%@ Page Language="C#‎" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form runat="server">
<%= "test1" %>
<%# "test2" %>
</form>
</body>
</html>

عبارت test2 هیچگاه چاپ نمیشه، چرا؟

به این تگ ها <% %> گفته میشه Inline Server Tags یا Inline Code Blocks اما این تگ ها انواع و وظایف مختلفی دارند و کدی که درون اونها نوشته میشه در زمان خاصی اجرا میشه که من به دو تا از اون ها که مد نظر شما هست اشاره می کنم:

Rendering Code که به شکل های زیر هستند:


<% Response.Write("Hello World!"); %>
<%= SayHello("Clover") %>
<%: DateTime.Now.ToString() %>

این کد ها همونطور که از اسمشون پیداست در طی فرآیند Render اجرا میشن و در صورتی که از حالت دوم و سوم استفاده بشه نتیجه به صورت یک رشته در خروجی صفحه ظاهر میشه.

Data Binding Syntax که در زمان Data Bind کنترل ها فراخوانی میشن و به فرم های زیر ممکنه باشند:


<%# Eval("Name") %>
<%# Bind("Name") %>
<%# XPath ("Name") %>

در کنترل های منبع داده ای عمل Data Bind به صورت خودکار اتفاق میفته. فکر می کنم الان می تونید متوجه بشید توی مثالی که در ابتدا آوردم چرا عبارت text2 چاپ نمیشه. چون Data Bind برای Page به صورت اتوماتیک اتفاق نمی افته، حالا کد های زیر رو اضافه کنید و نتیجه رو ببینید:

protected void Page_Load(object sender, EventArgs e)
{
Page.DataBind();
}

می بینید که درون بلاک <% #%> هر کدی که بنویسیم زمانی که Data Bind برای اون کنترلی که این بلاک داخلش قرار داره اتفاق بیفته اجرا میشه، به طور مثال می تونید این کد رو تست کنید:

<%# Page.Title = "test" %>

اما حالا سوال اینه که ()Eval چه نقشی ایفا می کنه. تابع Eval یکی از توابع عضو کلاس TemplateControl هست که به این شکل پیاده سازی شده:

/// <summary>Evaluates a data-binding expression.</summary>
/// <returns>An object that results from the evaluation of the data-binding expression.</returns>
/// <param name="expression">The navigation path from the container to the public property value to place in the bound control property.</param>
/// <exception cref="T:System.InvalidOperationException">The data-binding method can be used only for controls contained on a <see cref="T:System.Web.UI.Page" />. </exception>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="expression" /> is null. - or -<paramref name="expression" /> is an empty string ("").</exception>
protected internal object Eval(string expression)
{
this.CheckPageExists();
return DataBinder.Eval(this.Page.GetDataItem(), expression);
}
/// <summary>Evaluates a data-binding expression using the specified format string to display the result.</summary>
/// <returns>A string that results from the evaluation of the data-binding expression and conversion to a string type.</returns>
/// <param name="expression">The navigation path from the container to the public property value to place in the bound control property.</param>
/// <param name="format">A .NET Framework format string to apply to the result.</param>
/// <exception cref="T:System.InvalidOperationException">The data-binding method can only be used for controls contained on a <see cref="T:System.Web.UI.Page" />. </exception>
/// <exception cref="T:System.ArgumentNullException">
/// <paramref name="expression" /> is null. - or -<paramref name="expression" /> is an empty string ("").</exception>
protected internal string Eval(string expression, string format)
{
this.CheckPageExists();
return DataBinder.Eval(this.Page.GetDataItem(), expression, format);
}

همونطور که مشاهده می کنید درون این متد ()DataBinder.Eval فراخوانی میشه که دارای دو پارامتر هست. پارامتر دوم همون اسم فیلد هست که ما به متد Eval پاس دادیم. اما پارامتر اول شی داده ی جاری (مربوط به کنترلی که در حال Data Bind) هست که توسط متد ()Page.GetDataItem برگشت داده میشه. حالا می تونید متوجه بشید که فراخوانی تابع Eval در بلاک =%> به جای #%> چه تفاوتی داره. در واقع در حالت اول در حال رندر صفحه هستیم و هیچ Data Item جاری ای نداریم. در این حالت فراخوانی ()Page.GetDataItem منجر به اکسپشن Page_MissingDataBindingContext میشه و شما با خطای معروف زیر مواجه میشید:


Databinding methods such as Eval(), XPath(), and Bind() can only be used in the context of a databound control.

امیدوارم توضیحاتم مفید بوده باشه و اگر جایی اشتباه کردم اساتید تصحیح بفرمایند.