當在一個
Web頁面中進行操作時,在默認情況下向當前頁進行提交。這種行爲在出現之前並沒有什麼關係,但在中當我們想向另外一個Web頁提交一個Web
Form時該如何做呢?在1.0中這個問題變得很難解決,但在2.0中爲開發人員提供了更容易的解決的技術:跨網頁提交。這種技術允許一個網頁在提交數據時提交給另外的一個頁面。在跨網頁提交中,用於初始化提交代碼的頁面叫源頁面,而客戶提交的頁面叫目標頁面。
爲了方便起見,目標頁面仍然獲得原頁面提交的所有數據。換名話說,從技術觀點出發,我們可以用同樣的方式處理其他頁面提交的數據。
這個新特性意味着2.0開發人員目前有三種可供選擇的技術來將數據從一個web頁面傳送到另外一個頁面。這三種方法是:響應重定向,服務端傳輸和新的跨網頁提交特性。我們可以已經熟悉前兩種技術了,因此,我們只是簡要地複習一下它們,然後我們會將主要精力放到學習如何使用跨網頁提交特性,以及闡述一下這種方法和響應重定向以及服務傳輸方式有什麼不同。
一、響應重定向方法
響應重定向方法是目前爲止將一個網頁重定向到另一個網頁的最簡單的方法的最簡單的方法。當Web服務器接到一個重定向請求後,它會將一個響應頭送給客戶端,這將導致客戶端發送一個新的請求到服務器。按句話說,一個重定向請求實際上是兩個請求響應:一個是最初的請求響應,另一個是新的重定向請求響應。
在中實現重定向很容易。下面的代碼演示瞭如何使用rect方法實現網頁重定向:
protected
void
Redirect_Click(object
sender,
EventArgs
e)
{
rect("");
}
要注意的是重定向請求只是一個GET請求,這就意味着我們不能從源頁中透過重定向命令提交數據。但是我們可以在重定向中使用查詢字元串來傳遞數據。如下面代碼所示:
protected
void
Redirect_Click(object
sender,
EventArgs
e)
{
rect("
));
}
上面的例子將一個查詢字元串作爲參數傳遞給了rect方法的目標URL。我們可以透過如下的代碼獲得源數據。
protected
void
Page_Load(object
sender,
EventArgs
e)
{
string
userName
Request["userName"];
}
二、服務器傳輸方法
和依賴於客戶端向另一個新頁發請求不同,服務器傳輸是一種服務器重定向技術,這種技術透過簡單的改變Web服務器所處理的代碼來達到請求一個新頁的目的。當被請求頁和源頁面在同一個服務器時,服務器傳輸要比rect方法更有效,這是由於這種技術可以避免額外的開銷,僅僅使用服務器的資源就可以進行重定向。要注意的這種技術有一個副作用,在頁面進行重定向時,客戶端的URL仍然會保持源頁面的URL,這可能會使客戶認爲他們所獲得的數據是源頁面產生的。當然,在大多數情況下,這不是問題,但是這將使調試變得更困難。
sfer方法還可以儲存初始頁的HttpContext。因此,目標頁可以訪問源頁面的值。我們可以使用FormsCollection屬性來從目標頁面中獲得源頁面的值。首先,要確定我們使用了被重載的方法,這個方法有兩個參數:目標URL和一個Boolean類型的值,告訴服務器是否儲存用於描述源頁面值的Form。如下面的代碼所示:
[NextPage]
sfer("",true);
然後,我們在目標頁面中獲得一個叫txtUserName的Textbox控件的值的代碼如下:
object
obj
["txtUserName"];
三、rect和sfer的比較
由於rect方法要進行兩次請求響應操作,因此,我們應該在對性能要求高的網站儘量避免使用這種方法。然而,只從技術上說,使用redirect方式確實可以從一個網頁跳到另一個網頁。相比之下,sfer會更有效率,但是跳轉的範圍僅限於同一個Web服務器的不同網頁。從本質上說,我們可以使用sfer來消除不必要的請求響應操作。如果我們需要重定位到不同服務器的網頁,就需要使用rect方法。
四、跨頁提交概述
在
2.0中,我們可以透過實現IbuttonControl接口提交給不同的WebForm,來實現跨網頁的提交。和rect類似,跨網頁提交是一個基於客戶端的傳輸機制,但也有點象sfer,目標網頁也可以訪問源網頁的數據。爲了使用跨網頁提交,我們需要在源網頁中的PostBackUrl屬性中指定目標URL。
五、實現跨網頁提交
這部分將討論一下如何在2.0中實現跨網頁提交。爲了開始我們的學習,假設有兩個Web頁,一個是源Web頁,另一個是目標Web頁。在源網頁中初始化了使用按鈕進行的跨網頁提交操作。我們首先必須設定目標網頁按鈕的PostBackUrl屬性,順便說一句,所有實現了tonControl接口的Web控件都有跨網頁提交的特性。下面的代碼將演示這一過程。
PostBackUrl="~/"
text
"Post
to
a
target
page"/>
當我們設定PostBackUrl屬性時,框架將相應的控件綁定到一個新的叫WebForm_DoPostBackWithOptions的JavaScript函數,產生的Html代碼如下:
onclick="javascript:WebForm_DoPostBackWithOptions(
new
WebForm_PostBackOptions("btnSubmit",
false,
"",
false,
false))"
id="btnSubmit"
/>
對於上面的html代碼來說,當用戶單擊按鈕時,瀏覽器將提交目標URL(),而不是源URL。
六、從目標頁面中獲得源頁面控件的值
2.0提供了一個叫PreviousPage的新的屬性,這個屬性無論在何時當前頁面進行跨網頁提交操作時都會指向源頁面。要注意的是,當源頁面和目標頁面在不同的應用程序中時,這個屬性包含null(這個null並不是未初始化的意思)。還有要注意的是當目標網頁訪問PreviousPage屬性時可以獲得源頁面的數據,執行時裝載並執行了源頁面。這將引發ProcessChildRequest事件的發生。而且,它還會引發Page_Init事件、Page_Load和任何其他的`源頁面按鈕單擊事件。
因此,我們要避免由於不小心進行誤操作,所以最好透過IsCrossPostBack屬性來確認是否爲一個跨網頁提交發生,如果這個屬性值爲true,那麼目標網頁就是透過一個跨網頁提交動作而調用的。如果是透過另外一種方式調用的(如一般的請求、rect或是一個sfer),這個屬性的值爲false。下面的例子演示瞭如何使用這個屬性。
if
ossPagePostBack)
{
//執行代碼
}[NextPage]
這個PreviousPage屬性在sfer和跨網頁提交中都可以使用。在2.0中,我們可以在調用sfer操作後使用PreviousPage屬性在目標頁面中來獲得源頁面的數據,代碼如下:
{
sfer("");
}
protected
void
Redirect_Click(object
sender,
EventArgs
e)
在這個接收面中我們現在可以獲得Web頁面的數據,代碼如下:
protected
void
Page_Load(object
sender,
EventArgs
e)
{
if
(PreviousPage
null)
{
TextBox
txtBox
(TextBox)
Control("txtUserName");
if
(textBox
null)
string
userName
;
//其他可執行的代碼
}
}
要注意的是上面的代碼必須將txtUserName控件轉換爲TextBox類型,以便可以訪問其中的值。
七、使用PreviousPageType
PreviousPageType屬性提供了在跨網頁操作中訪問源頁面的強類型能力,下面讓我們演示一下如何不透過任何類型轉換來從源頁面中獲得控件值。代碼如下:
<
asp:Textbox
ID="txtUserName"
Runat="server"
/>
<
asp:Textbox
ID="txtPassword"
Runat="server"
/>
<
asp:Button
ID="Submit"
Runat="server"
Text="Login"
PostBackUrl=""
/>
要注意的是單擊按鈕可以重定向到一個叫“”的目標頁。這個目標頁可以使用如下的代碼獲得用戶名和密碼:
八、儲存視圖狀態
對於跨網頁提交來說,2.0
內嵌了一個叫__POSTBACK的隱藏字段,這個字段包含了關於源頁面的視圖資訊
也就是由源頁面提供了,包含了一個帶有一個非空PostBackUrl屬性值的服務端控件。目標頁可以使用__POSTBACK中的資訊來獲得源頁面的視圖狀態資訊。代碼如下:
if(PreviousPage!=null
&&
ossPagePostBack
&&
lid)
{
TextBox
txtBox
Control("txtUserName");
e();
}
在上面的代碼中核對了用於確保PreviousPage屬性不爲null的檢查代碼。順便提一下,如果目標頁和源頁面不在同一個應用程序中,這個PreviousPage屬性的值爲null。只有在進行跨網頁提交操作時,IsCrossPagePostBack屬性才爲true。
這個跨網頁提交的特性,是2.0中最強有力的特性之一,這種技術將允許在一個頁面中提交到另外一個頁面,並且可以在目標頁面地無縫地操作源頁面中的數據。
2.0 權限樹的控制
做權限的時候,主要實現如下功能
1、該節點可以訪問,則他的父節點也必能訪問;
2、該節點可以訪問,則他的子節點也都能訪問;
3、該節點不可訪問,則他的子節點也不能訪問。
使用帶CheckBox的數型結構能得到很好的用戶體驗,可是編程的難度也是有點增加,如果全部有服務端來完成,那點下刷下,肯定不行,只能使用javascript,javascript調試的時候鬱悶的很,一個字類,還有鬱悶的遞歸,麻煩
我以前是使用以下該方法
<script
language="javascript">
//oncheck事件
function
tree_oncheck(tree)
{
var
i;
var
node=reeNode(kedNodeIndex);
var
Pchecked=reeNode(kedNodeIndex)ttribute("checked");
setcheck(node,Pchecked);
setParent(node,Pchecked);
//t(Pchecked);
e
if
(hildren()th
>
0)
{
for
(i=0;i<=hildren()th-1;i++)
{
if
(hildren()[i]ttribute("Checked"))
{
AddChecked(hildren()[i]);
}
FindCheckedFromNode(hildren()[i]);
}
}
}
//設定子節點選中
function
setcheck(node,Pchecked)
{
var
i;
var
ChildNode=new
Array();
ChildNode=hildren();
if(parseInt(th)==0)
{
return;
}
else
{
for(i=0;i<th;i++)
{
var
cNode;
cNode=ChildNode[i];
ttribute("Checked",Pchecked);
//ked
Pchecked;
if(parseInt(hildren()th)!=0)
{
setcheck(cNode,Pchecked);
}
}
}
}
//設定子節點選中/取消;
//同時需要設定父節點的狀態(如果是取消選中的話,僅僅設定本節點及其所有字接點,不涉及父接點)
function
setParent(node,Pc)
{
var
parentNode
arent();
if(parentNode)
{
var
parentNodeFather
arent();
if(parentNodeFather)
{
setParent(parentNode,Pc);
}
if(Pc)
{ttribute("checked",Pc);}
else
{
checkBrother(parentNode,Pc,ttribute("NodeData"))
}
}
}
//檢查子接點是否有選擇的,如果有一個選擇了,那返回true
//只查第一級節點.
function
checkBrother(parentNode,Pc,NodeData)
{
var
childNodes
new
Array();
childNodes
hildren();
if(th
>0)
{
var
bChecked
true;
for(var
i=0;i<th;i++)
{
if(childNodes[i]ttribute("checked")
true
&&
childNodes[i]ttribute("NodeData")
NodeData)
{
//alert(i+childNodes[i]ttribute("Text"));
bChecked
false;
break;
}
}
if(bChecked)
{
ttribute("checked",Pc);
}
else
{
//所有父結點選擇
setParent(parentNode,!Pc)
}
}
else
{
ttribute("checked",Pc);
}
}
//獲取所有節點狀態
function
FindCheckedFromNode(node)
{
var
i
0;
var
nodes
new
Array();
nodes
hildren();
for
(i
0;
i
<=
th
1;
i++)
{
if
(nodes[i]ttribute("Checked"))
{
AddChecked(nodes[i]);
}
if
(parseInt(nodes[i]hildren()th)
{
FindCheckedFromNode(nodes[i]);
}
}
}
//添加選中節點
function
AddChecked(node)
{
e
ttribute("NodeData")
}
//-->
這種方法有個很大的問題,就是他客戶端設定的CheckBox在服務器端是不能獲取的,現在只能在Check的時候遍歷樹,並把Checked的值放在一個文字裏,然後提交到服務器,然後服務器來解析1@2@這種字元
現在我使用的是2.0,使用的是以下的方法
function
public_GetParentByTagName(element,
tagName)
{
var
parent
ntNode;
var
upperTagName
perCase();
//如果這個元素還不是想要的tag就繼續上溯
while
(parent
&&
(perCase()
upperTagName))
{
parent
ntNode
ntNode
ntElement;
}
return
parent;
}
//設定節點的父節點Cheched——該節點可訪問,則他的父節點也必能訪問
function
setParentChecked(objNode)
{
var
objParentDiv
public_GetParentByTagName(objNode,"div");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
var
objID
ttribute("ID");
objID
tring(0,xOf("Nodes"));
objID
objID+"CheckBox";
var
objParentCheckBox
lementById(objID);
if(objParentCheckBox==null
objParentCheckBox
"undefined")
{
return;
}
if(ame!="INPUT"
&&
"checkbox")
return;
ked
true;
setParentChecked(objParentCheckBox);
}
//設定節點的子節點uncheched——該節點不可訪問,則他的子節點也不能訪問
function
setChildUnChecked(divID)
{
var
objchild
dren;
var
count
th;
for(var
i=0;i<th;i++)
{
var
tempObj
objchild[i];
if(ame=="INPUT"
&&
"checkbox")
{
ked
false;
}
setChildUnChecked(tempObj);
}
}
//設定節點的子節點cheched——該節點可以訪問,則他的子節點也都能訪問
function
setChildChecked(divID)
{
var
objchild
dren;
var
count
th;
for(var
i=0;i<th;i++)
{
var
tempObj
objchild[i];
if(ame=="INPUT"
&&
"checkbox")
{
ked
true;
}
setChildChecked(tempObj);
}
}
//觸發事件
function
CheckEvent()
{
var
objNode
lement;
if(ame!="INPUT"
!="checkbox")
return;
if(ked==true)
{
setParentChecked(objNode);
var
objID
ttribute("ID");
var
objID
tring(0,xOf("CheckBox"));
var
objParentDiv
lementById(objID+"Nodes");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
setChildChecked(objParentDiv);
}
else
{
var
objID
ttribute("ID");
var
objID
tring(0,xOf("CheckBox"));
var
objParentDiv
lementById(objID+"Nodes");
if(objParentDiv==null
objParentDiv
"undefined")
{
return;
}
setChildUnChecked(objParentDiv);
}
}這種方法最大的好處就是服務端能得javascript設定的Checked的值,不用沒點下就全部把樹遍利下,直接在服務端遍利一次就行了
//遍歷子節點
public
void
GetChildNode(TreeNode
Node)
{
foreach
(TreeNode
node
in
dNodes)
{
if
(ked)
{
StrChecked
e+"@";
}
GetChildNode(node);
}
}
我照樣能得到它的Check的值
2.0中XML數據的處理
SqlDataSource和ObjectDataSource控件都是平面表格式的數據源控件,操作也相對簡單,在這裏我就不細說了.
在這裏我主要談下用於連接XML檔案的XmlDataSource和用於連接站點導航數據的SiteMapDataSource這兩個層次數據源控件中XmlDataSource數據綁定到平面表格控件的一起東東.
XmlDataSource控件允許其它控件綁定到XML數據。XmlDataSource支援DataFile屬性,它被用於指定作爲輸入(input)的XML數據檔案的路徑。你還可以指定TranformFile屬性,給數據應用XSLT轉換;設定XPath屬性來指定需要暴露的數據源節點的子集。
<asp:XmlDataSource
ID="myXmlDataSource"
runat="server"
DataFile="~/"
TransformFile="~transXml"
XPath="//User">
表格式數據綁定控件綁定到分層數據源也是可行的,但是它只能顯示第一層數據。在下面的demo中,Repeater控件綁定到
檔案。由於數據源暴露的頂層節點是<User/>節點,Repeater可以在自己的ItemTemplate模板中使用Eval數據綁定語法綁定到這些節點的屬性。
<asp:Repeater
runat="server"
ID="myReater2"
DataSourceID="myXmlDataSource">
標題
姓名:<%#
Eval("Name")
%>
Email:<%#
Eval("Email")
%>
除了Eval數據綁定語法之外,
2.0還提供了基於XPath的數據綁定語法,在實現了IXPathNavigable接口的任何數據項上都可以使用它。這裏介紹兩種常用的表達式類型:
XPath(expression,
[formatString])
根據數據項計算Xpath表達式的值,返回單個值。
XPathSelect(expression,
[formatString])
根據數據項計算Xpath表達式的值,返回節點列表。
下面我們來看看使用Xpath數據綁定方法的優勢,透過一個demo來說明.
Repeater的ItemTemplate模板另外增加了一個Repeater,並把這個內部Repeater的屬性綁定到一個描述當前User節點的Reply子節點的XPathSelect表達式。在內部Repeater的ItemTemplate模板中,Xpath數據綁定表達式根據這些"Reply"內容節點來計算值。
2.0利用這種技術,使你能夠透過組合表格式數據綁定控件簡便地構造出豐富的、分層的數據顯示方式。
<asp:Repeater
runat="server"
ID="myRpeater"
DataSourceID="myXmlDataSource">
標題
ID:<%#
XPath("@ID")
%>
姓名:
Email:
Content:
<asp:Repeater
runat="server"
ID="childRepeater"
DataSource='<%#
XPathSelect("Reply")
%>'>
留言
ReplyID:<%#XPath("ID")
%>
Time:<%#
XPath("Time")
%>
Content:<%#
XPath("Content")
%>
使用 2.0中的ReportViewer控件
介紹
任何數據驅動型的應用程序都有一個普遍的需求,那就是報表。
但是,在
1.x中並沒有給我們提供這個非常重要的特性。
然而很幸運的是,伴隨着。NET
2.0而來的ReportViewer控件可以滿足你對報表的一些基本需求。
我將會在本文中向你演示如何使用這個控件。
ReportViewer控件既可以在web程序中使用,也可以在windows程序中使用。
在這裏,我將只介紹如何在web程序中使用它。
報表示例
我們假設要生成一個如下所示的顧客資訊列表:
上面的報表是一個非常簡單的以國家分組的顧客資訊列表。
報表的數據是從Northwind數據庫的Customers表裏獲取的。
默認情況下,它會顯示所有的顧客資訊。
但是,你也可以讓它顯示屬於你指定的某個國家的顧客資訊。
該報表是使用ReportViewer控件設計的,它可以從強類型的DataSet中或者自訂的對象集合中獲取數據。
在實際的程序開發中,我們往往會使用3層架構,數據的獲取經常會是從業務層取得的DataSet或一個泛型集合。
在這裏,我打算使用一個泛型集合作爲數據源,而不是強類型的DataSet.
創建類庫
首先,開啟Visual
Studio,然後創建一個名爲ReportViewerLib的類庫項目。
添加一個如下所示的名爲Customer的類:
using
System;using
;using
iguration;using
lient;using
ric;namespace
ReportViewerLib{
public
class
Customer
{
public
string
strCustomerID;
public
string
strCompanyName;
public
string
strContactName;
public
string
strCountry;
public
string
CustomerID
{
get
{
return
strCustomerID;
}
set
{
strCustomerID
value;
}
}
public
string
CompanyName
{
get
{
return
strCompanyName;
}
set
{
strCompanyName=
value;
}
}
public
string
ContactName
{
get
{
return
strContactName;
}
set
{
strContactName=
value;
}
}
public
string
Country
{
get
{
return
strCountry;
}
set
{
strCountry=
value;
}
}
public
static
List
GetCustomersForCountry(string
country)
{
SqlConnection
cnn=new
SqlConnection(
ectionStrings["NorthwindConnectionString"]ectionString);
SqlCommand
cmd=new
SqlCommand();
ection=cnn;
andText="select
CustomerID,CompanyName,ContactName,Countryfrom
customers
where
country=@country";
SqlParameter
p=new
SqlParameter("@country",country);
(p);
();
SqlDataReader
reader
uteReader();
List
list
new
List();
while
(())
{
Customer
c
new
Customer();
omerID
tring(0);
anyName
tring(1);
actName
tring(2);
try
tring(3);
(c);
}
e();
return
list;
}
public
static
List
GetAllCustomers()
{
SqlConnection
cnn
new
SqlConnection(
ectionStrings
["NorthwindConnectionString"]ectionString);
SqlCommand
cmd
new
SqlCommand();
ection
cnn;
andText
"select
CustomerID,CompanyName,ContactName,Country
from
customers";
();
SqlDataReader
reader
uteReader();
List
list
new
List();
while
(())
{
Customer
c
new
Customer();
omerID
tring(0);
anyName
tring(1);
actName
tring(2);
try
tring(3);
(c);
}
e();
return
list;
}
}}
123456下一頁
GOvar
pager=new
iwmsPager(1,6,true);
[新品]指紋私密 CECT超薄手寫S10低價到貨! 01-08 -
指紋手機,這一新興的手機功能在CECT
T100的強勢上市後被廣大機友所熟知並喜愛起來,而藉着這順風順水的人氣,CECT又推出了一款指紋安全手機S10,它可以輕鬆實現六大指紋安全功能:指紋加密、指紋隱形、指紋防盜、指紋鼠標、指紋撥號和指紋動作。而CECT
S10的整體表現會不會如T100一樣帶給我們無限驚喜呢?請機友們跟隨汀汀的文字一起去解一下吧,說不定你會在瞬間選中它!
作爲熱賣機型CECT
T100的升級版本,CECT
S10在外形上略作修改,但更顯精練輕巧,商務氣息依然濃郁。而直板PDA手機風格造型的S10三圍尺寸爲113×54×11mm,做工精良,超薄的機身秀氣中不乏端莊。屏幕方面,CECT
S10擁有一塊26萬色的TFT屏幕,分辨率爲目前主流的320*240像素QVGA分辨率,採用觸摸式設計,支援手寫、鍵盤雙輸入方式,並支援大字型撥號。
娛樂方面,CECT
S10具有實時流媒體播放,MP3和MP4播放器,錄音機、卡拉OK等功能,而內置的任天堂遊戲模擬器,附送遊戲高達2000個。在攝像頭方面,S10內置130萬像素CMOS攝像頭,最大支援640*460分辨率的照片拍攝,支援數碼變焦、三種照片質量等拍攝模式,並支援有聲視頻拍攝!此外,CECT
S10還能方便上網和收發電子郵件,內置資訊時空包括SMS、MMS、IVR、WAP四大類約160個應用。同時,S10還支援大容量T-FLASH擴展存儲卡,並可做U盤使用。
強大的指紋識別和保密功能是CECT
S10的突出特色,它透過指紋加密、指紋隱形、指紋防盜、指紋鼠標、指紋撥號和指紋動作這些功能巧妙地把私密資訊保護、通信資訊隱藏、通信人身份隱藏與快捷操作方式相結合,使用起來不僅令人放心而且舒心,不會擔心因不慎導致的個人資訊泄露。另外,S10的電話簿容量爲1000個,可以多種方式進行索引,支援羣組功能,短資訊容量高達400條,足以保留足夠多的個人短息和商務短信。
縱觀CECT
S10的整體表現,它的主要賣點是集中在QVGA分辨率的26萬色TFT屏幕、支援手寫鍵盤雙輸入、娛樂遊戲擴展功能以及最爲可圈可點的指紋識別和保密功能。而以上的這些賣點再配以目前北斗手機網699元的售價就更是划算至極了,喜歡的機友沒有理由不選它哦!
[新品]拍照新旗艦 500W索愛K858c盛情上市! 01-08 -
拍照手機的迅猛發展是時代大環境所需,同時也出乎了很多人的意料!如今200萬像素已經成爲了新機上市的家常便飯,320萬像素可以和主流手機貼貼邊,500萬像素纔是真正的大勢所趨!在看過了其它廠家的500W像素新機上市後,索尼愛立信Cyber-shot品牌下的拍照悍將K858c也終於閃亮登場了,歡迎已經迫不急待想熟知它一切功能的機友和汀汀一起對K858c來個從頭至尾的瞭解,它的強大功能定會令你不由自主的傾心於它!
索愛K858c採用索愛最拿手的直板式造型設計,機身線條筆直硬朗,酷勁十足,尤其是採用黑色爲主色調更增強了它的視覺衝擊力。在色彩搭配選擇上,除了經典的黑色外,K858c的功能鍵、鏡頭部分和LOGO標籤都是採用銀色點綴,再配上眩目的綠色方向導航鍵和機身周邊裝飾條,非常惹眼。屏幕方面,K858c採用了一塊2.2英寸的26萬色TFT顯示屏幕,分辨率達到了QVGA級別(240×320像素)。依照索尼愛立信公司的一貫作風,K858c的屏幕顯示非常優秀,畫面細膩度和文字銳度表現得近乎完美。
索愛K858c的背面設計融入了相機血統,採用雙面卡片DC設計原則,所配備的500萬像素鏡頭支援自動對焦、氙氣閃光燈、16倍數碼變焦等豐富影像功能,完全採用Cyber-shot數碼相機的操作介面,影像選單比以往更加直觀,DC感更加強烈。另外,Best
Pic、Photo
fix等優化軟件的運用也令照片趨於完美。
索愛K858c內置MP3播放器具備WALKMAN獨有的Mega
Bass音效,支援藍牙2.0,A2DP標準,配合高質量藍牙立體聲耳機,效果震憾。此外,K858c除了擁有40MB機身內存外,還創造了一個行業第一,它不僅支援M2卡,同時還支援Micro
SD卡的擴展,而且兩個存儲卡的擴展都使用一個插槽,不同的只是插卡的方向。
這一場由索愛K858c所引爆的拍照風潮正向我們襲來,它的整體表現足以成爲拍照手機領域裏的新旗艦,並有能力與其它各大品牌的500萬像素手機相抗衡!北斗手機網4280元的上市售價也算厚道,歡迎有實力嚐鮮的機友們先用爲快,來體驗一下K858c所釋放出來無窮魅力!