ASP.NET 2.0 中跨網頁提交的方法有哪三種

才智咖 人氣:1.52W

當在一個

ASP.NET 2.0 中跨網頁提交的方法有哪三種

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所釋放出來無窮魅力!