問題是在程式碼當中的移至定義、前往實作失效,物件變成白色
而且在類別檢視中看不到建立的namespace與class
解決方式是將專案中的.vs隱藏資料夾砍掉重新編譯
2019年5月22日 星期三
2019年2月22日 星期五
Aws SQS流程
網站丟出 SQS queue 之後,在web專案使用Subscriber將Queue接受,最後再執行程式
注意的是如果Subscriber除了本機以外還有lab在接收,可能Queue會先被lab搶走,另外測試時webconfig記得注意有沒有關閉設定
注意的是如果Subscriber除了本機以外還有lab在接收,可能Queue會先被lab搶走,另外測試時webconfig記得注意有沒有關閉設定
2018年6月29日 星期五
Autofac 相關
註冊物件
UnitTestContainerFactory.InitExternalRegistrarInstance(builder =>
{
builder.RegisterInstance(mockDealerApplyRepository.Object)
.As<IDealerApplyRepository>()
.SingleInstance();
這個是把IDealerApplyRepository介面註冊時使用 mockDealerApplyRepository 這個已經被new出來的物件實體,然後最後面的SingleInstance指的是每個實作都用同一個物件
builder.RegisterType<MockDealerApplyRepository>()
.As<IDealerApplyRepository>()
.InstancePerLifetimeScope();
這邊的IDealerApplyRepository介面註冊則是使用MockDealerApplyRepository類別,就是使用class宣告
});
另一種使用
如果同一介面需要兩個實作註冊,可以使用
builder
.RegisterType<CreateDealerTask>()
.Keyed<IDealerTask>(DealerTaskActionEnum.Create)
.InstancePerLifetimeScope();
builder
.RegisterType<UpdateDealerTask>()
.Keyed<IDealerTask>(DealerTaskActionEnum.Update)
.InstancePerLifetimeScope();
一樣都是IDealerTask介面,不過CreateDealerTask、UpdateDealerTask都可以用
但是這樣在使用時必須宣告清楚
IDealerTask task = this.ResolveKeyed<IDealerTask>(DealerTaskActionEnum.Create);
/// <summary>
/// Senao.Admin 單元測試 DI 容器工廠
/// </summary>
public class UnitTestContainerFactory : UnitTestContainerFactoryBase<UnitTestContainerFactory>
{
/// <summary>
/// 建構子
/// </summary>
protected UnitTestContainerFactory()
{
}
/// <summary>
/// 建構子,支援額外類型註冊
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
protected UnitTestContainerFactory(Action<ContainerBuilder> externalTypeRegister) : base(externalTypeRegister)
{
}
/// <summary>
/// 於子類實作之註冊類型之設定
/// </summary>
/// <param name="builder">
/// Used to build an <see cref="T:Autofac.IContainer"/> from component registrations.
/// </param>
protected override void RegisterTypes(ContainerBuilder builder)
{
// 此處載入該 solution 引用之 Helper、Repository & Service 專案
IEnumerable<Assembly> assemblies = Assembly.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.Concat(new[]
{
Assembly.Load("Clam.Common.Helper"),
Assembly.Load("Clam.Common.Repository"),
Assembly.Load("Clam.Common.Service"),
Assembly.Load("Clam.Common.UnitTest"), Assembly.Load("Clam.Dealer.Channel.Helper"),
Assembly.Load("Clam.Dealer.Channel.Repository"),
Assembly.Load("Clam.Dealer.Channel.Service")
});
// 取得 ITypeRegistrar
IOrderedEnumerable<ITypeRegistrar> registrars = assemblies
.SelectMany(p => p.ExportedTypes.Where(s => s.IsAssignableTo<ITypeRegistrar>() && !s.IsInterface))
.Select(p => (ITypeRegistrar)Activator.CreateInstance(p))
.OrderBy(p => p.Order);
// 對 Helper、Repository & Service 進行分別註冊
foreach (ITypeRegistrar registrar in registrars)
{
registrar.RegisterTypes(builder);
}
builder.RegisterCallback(p =>
{
foreach (IComponentRegistration item in p.Registrations)
{
item.LogActualRegistration();
}
});
// 以下進行共用 Mock 物件註冊
builder
.RegisterType<ConfigHelper>()
.As<IConfigHelper>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockExecutionContext>()
.As<IExecutionContext>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockUserContext>()
.As<IUserContext<UserInfo>>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockUserContext>()
.As<IUserContext<IIdentity<string>>>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockEmailService>()
.As<IEmailService>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<NullLoggerFactory>()
.As<ILoggerFactory>()
.SingleInstance()
.LogExpectRegistration();
builder
.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
builder
.RegisterType<MockTaskProvider>()
.As<ITaskProvider>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
}
}
/// <summary>
/// 單元測試專用之相依性注入容器抽象工廠
/// </summary>
/// <typeparam name="TContainerFactory">具體容器工廠</typeparam>
public abstract class UnitTestContainerFactoryBase<TContainerFactory>
where TContainerFactory : UnitTestContainerFactoryBase<TContainerFactory>
{
/// <summary>
/// 單一實例,延遲載入
/// </summary>
private static Lazy<TContainerFactory> Instance;
/// <summary>
/// 除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派
/// </summary>
private readonly Action<ContainerBuilder> ExternalTypeRegister;
/// <summary>
/// DI 容器實例
/// </summary>
private IContainer ContainerInstance;
/// <summary>
/// 建構子
/// </summary>
protected UnitTestContainerFactoryBase()
{
this.ExternalTypeRegister = null;
}
/// <summary>
/// 建構子,支援額外類型註冊
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
protected UnitTestContainerFactoryBase(Action<ContainerBuilder> externalTypeRegister)
{
this.ExternalTypeRegister = externalTypeRegister;
}
/// <summary>
/// 取得 Container
/// </summary>
/// <returns>IContainer</returns>
public IContainer Container => this.ContainerInstance ?? (this.ContainerInstance = this.BuildContainer());
/// <summary>
/// 建立具備額外類型註冊的 UnitTestContainerBuiler 之單一實例。
/// <para>在真正呼叫 <see cref="GetInstance"/> 之前,允許重新設定。</para>
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
public static void InitExternalRegistrarInstance(Action<ContainerBuilder> externalTypeRegister)
{
if (Instance != null && Instance.IsValueCreated)
{
return;
}
// 使用 Reflection 的方式維持繼承下的單例模式
Instance =
new Lazy<TContainerFactory>(() => (TContainerFactory)Activator.CreateInstance(
typeof(TContainerFactory),
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance,
null,
new object[] { externalTypeRegister },
CultureInfo.InvariantCulture));
}
/// <summary>
/// 取得 UnitTestContainerBuiler 的單一實例,
/// <para> 若測試類別未呼叫 <see cref="InitExternalRegistrarInstance"/> </para>
/// 則會取得無額外註冊類型的原始 UnitTestContainerBuiler
/// </summary>
/// <returns>UnitTestContainerBuiler</returns>
public static TContainerFactory GetInstance()
{
if (Instance != null)
{
return Instance.Value;
}
Instance = new Lazy<TContainerFactory>(() => (TContainerFactory)Activator.CreateInstance(
typeof(TContainerFactory),
true));
return Instance.Value;
}
/// <summary>
/// 重設 ContainerBuiler
/// </summary>
public static void RestContainerBuilder()
{
if (Instance == null || !Instance.IsValueCreated)
{
return;
}
Instance.Value.Container.Dispose();
Instance = null;
}
/// <summary>
/// 於子類實作之註冊類型之設定
/// </summary>
/// <param name="builder">Used to build an <see cref="T:Autofac.IContainer" /> from component registrations.</param>
protected abstract void RegisterTypes(ContainerBuilder builder);
/// <summary>
/// 建構容器
/// </summary>
/// <returns>IContainer</returns>
private IContainer BuildContainer()
{
ContainerBuilder builder = new ContainerBuilder();
this.RegisterTypes(builder);
// 註冊不同 test class 所定義之額外類別
this.ExternalTypeRegister?.Invoke(builder);
IContainer container = builder.Build();
return container;
}
}
UnitTestContainerFactory.InitExternalRegistrarInstance(builder =>
{
builder.RegisterInstance(mockDealerApplyRepository.Object)
.As<IDealerApplyRepository>()
.SingleInstance();
這個是把IDealerApplyRepository介面註冊時使用 mockDealerApplyRepository 這個已經被new出來的物件實體,然後最後面的SingleInstance指的是每個實作都用同一個物件
builder.RegisterType<MockDealerApplyRepository>()
.As<IDealerApplyRepository>()
.InstancePerLifetimeScope();
這邊的IDealerApplyRepository介面註冊則是使用MockDealerApplyRepository類別,就是使用class宣告
});
另一種使用
如果同一介面需要兩個實作註冊,可以使用
builder
.RegisterType<CreateDealerTask>()
.Keyed<IDealerTask>(DealerTaskActionEnum.Create)
.InstancePerLifetimeScope();
builder
.RegisterType<UpdateDealerTask>()
.Keyed<IDealerTask>(DealerTaskActionEnum.Update)
.InstancePerLifetimeScope();
一樣都是IDealerTask介面,不過CreateDealerTask、UpdateDealerTask都可以用
但是這樣在使用時必須宣告清楚
IDealerTask task = this.ResolveKeyed<IDealerTask>(DealerTaskActionEnum.Create);
/// <summary>
/// Senao.Admin 單元測試 DI 容器工廠
/// </summary>
public class UnitTestContainerFactory : UnitTestContainerFactoryBase<UnitTestContainerFactory>
{
/// <summary>
/// 建構子
/// </summary>
protected UnitTestContainerFactory()
{
}
/// <summary>
/// 建構子,支援額外類型註冊
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
protected UnitTestContainerFactory(Action<ContainerBuilder> externalTypeRegister) : base(externalTypeRegister)
{
}
/// <summary>
/// 於子類實作之註冊類型之設定
/// </summary>
/// <param name="builder">
/// Used to build an <see cref="T:Autofac.IContainer"/> from component registrations.
/// </param>
protected override void RegisterTypes(ContainerBuilder builder)
{
// 此處載入該 solution 引用之 Helper、Repository & Service 專案
IEnumerable<Assembly> assemblies = Assembly.GetExecutingAssembly()
.GetReferencedAssemblies()
.Select(Assembly.Load)
.Concat(new[]
{
Assembly.Load("Clam.Common.Helper"),
Assembly.Load("Clam.Common.Repository"),
Assembly.Load("Clam.Common.Service"),
Assembly.Load("Clam.Common.UnitTest"), Assembly.Load("Clam.Dealer.Channel.Helper"),
Assembly.Load("Clam.Dealer.Channel.Repository"),
Assembly.Load("Clam.Dealer.Channel.Service")
});
// 取得 ITypeRegistrar
IOrderedEnumerable<ITypeRegistrar> registrars = assemblies
.SelectMany(p => p.ExportedTypes.Where(s => s.IsAssignableTo<ITypeRegistrar>() && !s.IsInterface))
.Select(p => (ITypeRegistrar)Activator.CreateInstance(p))
.OrderBy(p => p.Order);
// 對 Helper、Repository & Service 進行分別註冊
foreach (ITypeRegistrar registrar in registrars)
{
registrar.RegisterTypes(builder);
}
builder.RegisterCallback(p =>
{
foreach (IComponentRegistration item in p.Registrations)
{
item.LogActualRegistration();
}
});
// 以下進行共用 Mock 物件註冊
builder
.RegisterType<ConfigHelper>()
.As<IConfigHelper>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockExecutionContext>()
.As<IExecutionContext>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockUserContext>()
.As<IUserContext<UserInfo>>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockUserContext>()
.As<IUserContext<IIdentity<string>>>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<MockEmailService>()
.As<IEmailService>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
builder
.RegisterType<NullLoggerFactory>()
.As<ILoggerFactory>()
.SingleInstance()
.LogExpectRegistration();
builder
.RegisterGeneric(typeof(Logger<>))
.As(typeof(ILogger<>))
.SingleInstance();
builder
.RegisterType<MockTaskProvider>()
.As<ITaskProvider>()
.InstancePerLifetimeScope()
.LogExpectRegistration();
}
}
/// <summary>
/// 單元測試專用之相依性注入容器抽象工廠
/// </summary>
/// <typeparam name="TContainerFactory">具體容器工廠</typeparam>
public abstract class UnitTestContainerFactoryBase<TContainerFactory>
where TContainerFactory : UnitTestContainerFactoryBase<TContainerFactory>
{
/// <summary>
/// 單一實例,延遲載入
/// </summary>
private static Lazy<TContainerFactory> Instance;
/// <summary>
/// 除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派
/// </summary>
private readonly Action<ContainerBuilder> ExternalTypeRegister;
/// <summary>
/// DI 容器實例
/// </summary>
private IContainer ContainerInstance;
/// <summary>
/// 建構子
/// </summary>
protected UnitTestContainerFactoryBase()
{
this.ExternalTypeRegister = null;
}
/// <summary>
/// 建構子,支援額外類型註冊
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
protected UnitTestContainerFactoryBase(Action<ContainerBuilder> externalTypeRegister)
{
this.ExternalTypeRegister = externalTypeRegister;
}
/// <summary>
/// 取得 Container
/// </summary>
/// <returns>IContainer</returns>
public IContainer Container => this.ContainerInstance ?? (this.ContainerInstance = this.BuildContainer());
/// <summary>
/// 建立具備額外類型註冊的 UnitTestContainerBuiler 之單一實例。
/// <para>在真正呼叫 <see cref="GetInstance"/> 之前,允許重新設定。</para>
/// </summary>
/// <param name="externalTypeRegister">除了底層共同註冊之外,不同的 TestClass 額外註冊的類別委派</param>
public static void InitExternalRegistrarInstance(Action<ContainerBuilder> externalTypeRegister)
{
if (Instance != null && Instance.IsValueCreated)
{
return;
}
// 使用 Reflection 的方式維持繼承下的單例模式
Instance =
new Lazy<TContainerFactory>(() => (TContainerFactory)Activator.CreateInstance(
typeof(TContainerFactory),
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.CreateInstance,
null,
new object[] { externalTypeRegister },
CultureInfo.InvariantCulture));
}
/// <summary>
/// 取得 UnitTestContainerBuiler 的單一實例,
/// <para> 若測試類別未呼叫 <see cref="InitExternalRegistrarInstance"/> </para>
/// 則會取得無額外註冊類型的原始 UnitTestContainerBuiler
/// </summary>
/// <returns>UnitTestContainerBuiler</returns>
public static TContainerFactory GetInstance()
{
if (Instance != null)
{
return Instance.Value;
}
Instance = new Lazy<TContainerFactory>(() => (TContainerFactory)Activator.CreateInstance(
typeof(TContainerFactory),
true));
return Instance.Value;
}
/// <summary>
/// 重設 ContainerBuiler
/// </summary>
public static void RestContainerBuilder()
{
if (Instance == null || !Instance.IsValueCreated)
{
return;
}
Instance.Value.Container.Dispose();
Instance = null;
}
/// <summary>
/// 於子類實作之註冊類型之設定
/// </summary>
/// <param name="builder">Used to build an <see cref="T:Autofac.IContainer" /> from component registrations.</param>
protected abstract void RegisterTypes(ContainerBuilder builder);
/// <summary>
/// 建構容器
/// </summary>
/// <returns>IContainer</returns>
private IContainer BuildContainer()
{
ContainerBuilder builder = new ContainerBuilder();
this.RegisterTypes(builder);
// 註冊不同 test class 所定義之額外類別
this.ExternalTypeRegister?.Invoke(builder);
IContainer container = builder.Build();
return container;
}
}
2018年5月11日 星期五
MVC Action上掛 Attribute 執行工作 (AOP)
[AttributeUsage(AttributeTargets.Method)]
public class AuthorizeAttribute : ActionFilterAttribute
{
/// <summary>
/// 功能項目
/// </summary>
public FunctionEnum Function { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
將要做的事情寫在這邊
base.OnActionExecuting(filterContext);
}
}
套用方式
MVC controller
[FunctionAuthorize(Function = FunctionEnum.Bank)]
public ActionResult Bank()
{
return this.View();
}
attribute後面帶進去的就是 field
public class AuthorizeAttribute : ActionFilterAttribute
{
/// <summary>
/// 功能項目
/// </summary>
public FunctionEnum Function { get; set; }
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
將要做的事情寫在這邊
base.OnActionExecuting(filterContext);
}
}
套用方式
MVC controller
[FunctionAuthorize(Function = FunctionEnum.Bank)]
public ActionResult Bank()
{
return this.View();
}
attribute後面帶進去的就是 field
2018年4月25日 星期三
EEP2015 錯誤訊息「無法載入檔案或組件'EFDesign,......」
解答:EEPNetServer的【WCF】菜單,點擊【Install Designer Component】
來源:http://www.infolight.com.tw/WebClient/DiscussDetail.aspx?ID=Mzc4NDkx&Author=&Target=X3NlbGY=&DataType=Mjg=
來源:http://www.infolight.com.tw/WebClient/DiscussDetail.aspx?ID=Mzc4NDkx&Author=&Target=X3NlbGY=&DataType=Mjg=
2018年3月2日 星期五
IE 列印自動縮放 (IE only 設定)
使用者如果使用IE,如果使用者不開啟自動縮小(檔案 -> 設定列印格式 -> 啟動自動縮小),列印頁面可能會無法全部顯示。
此時可設定只有列印才會使用的css,搭配 IE only 的 css
只有列印才會套用的css:
http://blog.darkthread.net/post-2009-11-06-css-media-types.aspx
@media print {
裡面放你要寫的class與樣式
}
附註:在cshtml裡面寫 @media衝突解決方式:
https://dotblogs.com.tw/kangting/2014/05/19/145178
(直接寫兩個@連用就好)
IE only css hack
https://gist.github.com/vidaaudrey/c16774076391d09e7ec7dbb7ed7a3189
此用法只能在 IE 9以下
IE 10以上
http://www.webhek.com/post/conditional-comments-in-ie11-10.html
2018年2月5日 星期一
IE11 ajax 不會觸發
因為IE有一個設定是自動判斷 ajax 資料是不是最新
網際網路選項 -> 瀏覽歷程記錄 -> 設定 -> Temporary Internet Files ->
檢查儲存的畫面是否有較新的版本 -> 設定為【每次造訪網頁時】
就會每次都觸發 ajax 更新
另一個方法是讓ajax不要讀快取
https://dotblogs.com.tw/jasonyah/2013/06/02/use-ajax-you-need-to-be-care
網際網路選項 -> 瀏覽歷程記錄 -> 設定 -> Temporary Internet Files ->
檢查儲存的畫面是否有較新的版本 -> 設定為【每次造訪網頁時】
就會每次都觸發 ajax 更新
另一個方法是讓ajax不要讀快取
https://dotblogs.com.tw/jasonyah/2013/06/02/use-ajax-you-need-to-be-care
2018年1月17日 星期三
2018年1月16日 星期二
2017年12月26日 星期二
Cookie、localstorage、sessionstorage
https://dotblogs.com.tw/jimmyyu/archive/2011/03/27/html5-client-storage.aspx
2017年12月15日 星期五
JQuery Validate Remote
http://www.cc.ntu.edu.tw/chinese/epaper/0033/20150620_3307.html
https://jqueryvalidation.org/remote-method/
自訂驗證方式主要是用ajax打後端取得驗證結果
範例如下:
var validator = $form.validate({
rules: {
//定義驗證規則,其中屬性名為表單的name屬性
'ApplicationContentViewModel.CellPhoneNumber': {
required: true,
remote: {
url: '/RentalApplication/CheckCellPhoneNumber',
type: 'POST',
dateType: 'json',
data: {
mobileType: function () {
setFilterData();
return filterData.MobileType;
},
cellPhoneNumber: function () {
return $('#ApplicationContentViewModel_CellPhoneNumber').val();
}
}
}
}
},
messages: {
'ApplicationContentViewModel.CellPhoneNumber': {
remote: "該郵箱已存在!"
}
}
});
https://jqueryvalidation.org/remote-method/
自訂驗證方式主要是用ajax打後端取得驗證結果
範例如下:
var validator = $form.validate({
rules: {
//定義驗證規則,其中屬性名為表單的name屬性
'ApplicationContentViewModel.CellPhoneNumber': {
required: true,
remote: {
url: '/RentalApplication/CheckCellPhoneNumber',
type: 'POST',
dateType: 'json',
data: {
mobileType: function () {
setFilterData();
return filterData.MobileType;
},
cellPhoneNumber: function () {
return $('#ApplicationContentViewModel_CellPhoneNumber').val();
}
}
}
}
},
messages: {
'ApplicationContentViewModel.CellPhoneNumber': {
remote: "該郵箱已存在!"
}
}
});
2017年12月14日 星期四
Remote validation (使用RemoteAttribute前端驗證)
https://iamsbc.blogspot.tw/2017/08/mvc-remote-validation-example.html
https://stackoverflow.com/questions/20650955/viewmodel-property-doesnt-bind-into-controller-action-parameter
踩地雷時間:
如果需要兩個參數可以用additionalfields
不過這邊會有一個雷點,這個field只會自動bind到同一個viewmodel內的field
如果要bind其他同一畫面不同viewmodel的話,需要改前端顯示input的
data-val-remote-additionalfields="*.CellPhoneNumber,ApplyTypeViewModel.MobileType"
手動改掉他,如果改不出來甚至不要用內建的html.textboxfor直接寫html input也可以
在@Html.TextBoxFor中new {}修改html attrbute
@data_val_remote_additionalfields = "*.CellPhoneNumber,ApplyTypeViewModel.MobileType"
記得是用底線【_】,轉成HTML後會自己改回【-】
補充資料:後端手動寫入錯誤訊息
https://blog.miniasp.com/post/2016/03/14/ASPNET-MVC-Developer-Note-Part-28-Understanding-ModelState.aspx
https://stackoverflow.com/questions/20650955/viewmodel-property-doesnt-bind-into-controller-action-parameter
踩地雷時間:
如果需要兩個參數可以用additionalfields
不過這邊會有一個雷點,這個field只會自動bind到同一個viewmodel內的field
如果要bind其他同一畫面不同viewmodel的話,需要改前端顯示input的
data-val-remote-additionalfields="*.CellPhoneNumber,ApplyTypeViewModel.MobileType"
手動改掉他,如果改不出來甚至不要用內建的html.textboxfor直接寫html input也可以
在@Html.TextBoxFor中new {}修改html attrbute
@data_val_remote_additionalfields = "*.CellPhoneNumber,ApplyTypeViewModel.MobileType"
記得是用底線【_】,轉成HTML後會自己改回【-】
補充資料:後端手動寫入錯誤訊息
https://blog.miniasp.com/post/2016/03/14/ASPNET-MVC-Developer-Note-Part-28-Understanding-ModelState.aspx
2017年12月6日 星期三
JQuery取得combobox(dropdownlist)被選擇到的值、文字
$('#yourdropdownid').find('option:selected').text();
$('#yourdropdownid').find('option:selected').val();
2017年12月5日 星期二
匿名宣告與匿名宣告陣列
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/classes-and-structs/anonymous-types
2017年11月22日 星期三
2017年11月17日 星期五
MVC Attribute Data Annotation 驗證
https://dotblogs.com.tw/mrsunboss/2013/01/03/86688
https://dotblogs.com.tw/harry/2016/07/06/150115
https://stackoverflow.com/questions/6269320/manually-bind-jquery-validation-after-ajax-request
https://dotblogs.com.tw/harry/2016/07/06/150115
https://stackoverflow.com/questions/6269320/manually-bind-jquery-validation-after-ajax-request
MVC 所有 try catch 放在同一個地方處理
http://www.huanlintalk.com/2013/01/aspnet-web-api-exception-filter.html
概念是new 一個 class 去繼承 exception,然後在app_start裡面config.filter 放進去
概念是new 一個 class 去繼承 exception,然後在app_start裡面config.filter 放進去
2017年11月16日 星期四
Oracle 取 Top 使用 Rownum
Oracle 沒有 Top 1 或是 Limit 語法,是使用 rownum 編號
使用方式如下,在Oracle中,rownum會比group by、order by更先執行,因此要用子查詢
select xxx from (select xxx from xxx order by xxx) where rownum<2
上面那句就是取 TOP 1
使用方式如下,在Oracle中,rownum會比group by、order by更先執行,因此要用子查詢
select xxx from (select xxx from xxx order by xxx) where rownum<2
上面那句就是取 TOP 1
2017年11月6日 星期一
Razor 文章暫放
有些東西之後不想花太多時間找,就暫時放這邊吧
把字串用Html方式顯示
https://stackoverflow.com/questions/27284734/render-a-string-as-html-in-c-sharp-razor
Html Helper 擴充函式、TagBuilder 組出 img 的 html tag
http://www.itorian.com/2012/10/html-helper-for-image-htmlimage.html
把字串用Html方式顯示
https://stackoverflow.com/questions/27284734/render-a-string-as-html-in-c-sharp-razor
Html Helper 擴充函式、TagBuilder 組出 img 的 html tag
http://www.itorian.com/2012/10/html-helper-for-image-htmlimage.html
2017年1月23日 星期一
OO與Testing 的講義連結
順序由上而下
[ASP.NET]91之ASP.NET由淺入深 不負責講座 Day14 – Object Oriented (1)
https://dotblogs.com.tw/hatelove/archive/2010/10/15/object-oriented.aspx
[物件導向]基礎篇:封裝、繼承、多型 (投影片分享)
https://dotblogs.com.tw/hatelove/archive/2012/07/20/object-oriented-training-encapsulation-inheritance-polymorphism-introduction.aspx
[物件導向]基礎篇:interface, abstract, 意圖導向設計 (投影片分享)
https://dotblogs.com.tw/hatelove/2012/07/23/object-oriented-training-abstract-interface-and-intention-driven-design-introduction
[Unit Test Tricks] Extract and Override
https://dotblogs.com.tw/hatelove/2015/11/26/unit-test-by-extract-and-override
[Unit Test Tricks] Static Setter Injection
https://dotblogs.com.tw/hatelove/2015/12/03/unit-test-by-static-setter-injection
http://www.netobjectives.com/PatternRepository/index.php?title=TheFacadePattern
訂閱:
文章 (Atom)