2017年7月17日 星期一

$http.post 錯誤處理

c#
====
try{
...
} catch (Exception ex)
{
     Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
     Response.Write(ex.詳細訊息());
     return null;
}

 public static string 詳細訊息(this Exception ex)
        {
            if (ex is System.Data.Entity.Validation.DbEntityValidationException)
                return ((System.Data.Entity.Validation.DbEntityValidationException)ex).EntityValidationErrors.SelectMany(a => a.ValidationErrors.Select(b => b.ErrorMessage)).Join("\n");
            else
                return ex.InnerException?.InnerException?.Message ?? ex.InnerException?.Message ?? ex.Message;
        }


javascript
====
 $http.post('@Url.Action("匯出")')
                 .then(function (response) {
                     ...
                }, function (response) {
                // response.data = ex.詳細訊息()
            });


注意 : web.config 需加入以下設定,否則 response.data 會固定為 iis 針對Response.StatusCode預設的資料
<system.webServer>
    <httpErrors existingResponse="PassThrough"></httpErrors>


asp.net webmethod 寫法
====
HttpContext.Current.Response.Write(ex.Message);
HttpContext.Current.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
HttpContext.Current.Response.Flush();
//忽視之後透過Response.Write輸出的內容
HttpContext.Current.Response.SuppressContent = true;
//忽略之後ASP.NET Pipeline的處理步驟,直接跳關到EndRequest
HttpContext.Current.ApplicationInstance.CompleteRequest();

2017年7月14日 星期五

複製 Entity Framework 的 Entity

(TEntity)db.Entry(obj).GetDatabaseValues().ToObject();

此種方式只會複製值,不會複製物件或其參考,不過效能不佳,不適合用在大量複製
若 model 有關聯其他 model,導覽屬性會造成以下兩種作法都無法複製
使用序列化方式
使用無差別屬性對應方式

Entity Framework 建立新物件並儲存後馬上取得關聯資料

使用 CreateProxy 建立物件,不要直接 new var newmodel = _contextXXX.CreateProxy<yyy>(); ... _contextXXX.yyy.Add(newmodel); await _contextXXX.SaveC...