顯示具有 ASP.NET MVC 標籤的文章。 顯示所有文章
顯示具有 ASP.NET MVC 標籤的文章。 顯示所有文章

2012年5月9日 星期三

ASP.NET MVC:改變View的charset編碼(Encoding)


最近有一個case是要將資料用post的方式傳給其他業者
其中有一個參數是中文字
而對方系統是使用big5編碼(都西元2012了...)
我們當然是UTF8
這下子有點玩了
看一下我的處理方式

以前在寫php時,只要在程式裡面加了下面這一行
header('Content-type: text/html; charset=big5');
Web Server在產生網頁時,就會以big5編碼

但是asp.net mvc 3呢
我的處理方式是:
寫一個繼承ActionFilterAttribute的class

protected class Big5CharsetAttribute : ActionFilterAttribute
{
  public override void OnActionExecuted(ActionExecutedContext filterContext)
  {
    filterContext.HttpContext.Response.AddHeader("Content-Type", "text/html; charset=big5");
    filterContext.HttpContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("Big5");
  }
}

重點就是這兩行
filterContext.HttpContext.Response.AddHeader("Content-Type", "text/html; charset=big5");
filterContext.HttpContext.Response.ContentEncoding = System.Text.Encoding.GetEncoding("Big5");
將ASP.NET MVC預設的header和編碼改成big5

然後,Controller的action名稱前面再加上[Big5CharsetAttribute]
例如:
[Big5CharsetAttribute]
public ActionResult AutoSubmitForm()
{
//your code

return View();
}

這樣,這個action就會用big5來產生view

還沒完喔,再來是html的部份
view最好要加上這一行
<meta http-equiv="Content-Type" content="text/html; charset=big5" />

這樣兩個系統就能用中文來溝通啦。
(還是老話一句,現在是unicode的時代...)

2012年3月1日 星期四

ASP.NET MVC如何避免CSRF攻擊

最近在研究web security
其中對於CSRF攻擊的介紹如下



至於在ASP.NET MVC 3 中要如何避免CSRF
可參考對岸朋友的這篇
http://kb.cnblogs.com/page/125667/
主要就是在Action前加上[ValidateAntiForgeryToken]
然後在相對應的view中加上@Html.AntiForgeryToken()
程式在執行的時候就會在cookie中產生一個像下面的token
例如: __RequestVerificationToken_Lw__=VjPo5qgNE7l5QSBoAe6FdD7/7Zh89aTW02jDYiAyJ+RmCxK5/KPMBrvkm8P/1PopvzaV9YvT08DgLNpcGu+ryEMRUNISZfhVlcl7eO3MbvXy68lGxZoR0U6mB/7yRzzPsMQ5HSkcwi7iKZnVzkCkPrSmCY6pYQimniihsxpLqCo=

然後在頁面post給action的時候
會多傳送一個token參數給action做識別
傳送參數如下:
__RequestVerificationToken=OOQLm1dSsAUruZiv1nM0gVr4tEPlxpZM2kTPTJMZGzLJAvv8VGdMqrtB0KwMXu%2BYbQiIkg%2FyNsGwtq%2FcIBSUill9pz4baRKy%2BkkptZiQpdWEy1SzqSHgicQz6T9jZUp2O759QuXTYu%2FWTpHSn6Ho5NQjyM%2Fd4PNRLG5WgUNyg3Q%3

可以利用Fiddler看一下form和cookie的變化。

2012年2月15日 星期三

ASP.NET MVC的cross domain功能

最近在做一個cross domain的功能
需要從A網站的網頁透過ajax到B網站去要資料
A網站和B網站都是公司服務的網站
這種cross domain的需求之前只有用過iframe的方式
不過這次是使用回傳JSONP的格式來達到cross domain的需求

後來找了很多資料,最後是參考到這篇:
Ajax json post to Controller across domains, “not allowed by” Access-Control-Allow-Headers

主要是寫一個回傳JsonpResult的ActionResult
Controller再透過JsonResult來回傳給ajax
而ajax的dataType記得要設定成'jsonp'格式

2011年9月23日 星期五

ASP.NET MVC自訂登入權限

在ASP.NET MVC中
有些Action的執行,必須先判斷使用者是否經過登入,或是有沒有相關權限
所以我們在controller的action名稱前,可加入[Authorize]這個Attribute
若使用者沒有登入,則將他導向Web.config中定義的登入頁
controller的部份

2011年9月9日 星期五

Html attributes for EditorFor() in ASP.NET MVC 3(use Razor)

最近剛使用ASP.NET的新的view engine:Razor
專案中想讓view的某個欄位是disable的
但是原本用Visual Studio幫你產生出來時,view中的code對於欄位會產生如下:

@Html.EditorFor(model => model.EmployeeNo)


想要讓該欄位disable,後來找了一下資料,試成這樣:

2011年9月1日 星期四

為ELMAH custom error page

ELMAH真是個記錄網站error的好工具
從NuGet下載安裝後
幾乎web.config都設定好了
不過我不想網站發生錯誤時,都跳出詳細的錯誤資訊給別人看
所以需要設定自訂錯誤頁

這時候,把web.config打開來
確認<configSections>有下面的資料(從NuGet安裝會自動幫你加)
<configSections>
    <sectionGroup name="elmah">
      <section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah" />
      <section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"  />
      <section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah" />
      <section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />     
    </sectionGroup>  
  </configSections>
再來是<httpModules>加上
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
 然後<httpHandlers>加上
<add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
以上是從NuGet安裝ELMAH後,會自動加上去的
再來就自己在<system.web> 區塊內加入
<customErrors mode="On" />
這裡可以指定你的錯誤頁,但是我目前預設是用View/Shared/Error.cshtml

還有在<configuration> section為你的xml log檔選個地方存檔
<elmah>
    <errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="D:/WebLog" />
  </elmah>
最後,確認一下Gobal.asax檔的RegisterRoutes method有沒有加上:
routes.IgnoreRoute( "elmah.axd" );  

按照上面的部份,照理說就可以work了
不過,我自己看官方文件的時候做完之後,是會導到自訂錯誤頁沒錯
可是看elmah.axd檔時,卻沒有任何error被log下來
後來發現我的web.conf檔有多了一個section
<system.webServer>
    <validation validateIntegratedModeConfiguration="false" />
    <modules runAllManagedModulesForAllRequests="true">
      <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
      <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
    </modules>
    <handlers>
      <add name="Elmah" path="elmah.axd" verb="POST,GET,HEAD" type="Elmah.ErrorLogPageFactory, Elmah" preCondition="integratedMode" />
    </handlers>
  </system.webServer>
把它拿掉之後,就可以了
目前還沒研究這一段有何功用
等改天研究好再PO出來

2011年8月29日 星期一

ViewData與TempData

都是繼承自System.Web.Mvc.ControllerBase都是實做IDictionary介面

ViewData用途:經由Controller將Data傳給View
TempData用途:經由Controller將Data傳給View

ViewData的生命週期:只有一個Action
TempData的生命週期:可跨Action(存在Session中),但是只能跨一個Action(透過RedirectToAction的方式),之後在下一個Action取出TempData的資料後,Session就會被清空。