MS_ASPNETMVCUsage - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒASP.NET MVCïŒ
ãASP.NET MVCã®å©ç𿹿³ãã¯
ãASP.NET MVCã®çšèªããšæ¯ã¹ãŠã
å°ã
é«åºŠãªå¿çšçãããã¯ããŸãšããŠããŸãã
è£è¶³ïŒæ¬ããŒãžã®åæïŒææ°åïŒ: ASP.NET MVCã®çšèª ãšåããã
.NET Framework çã® ASP.NET MVC 5ïŒSystem.Web.MvcïŒãåæãšããã
èšèšè«ïŒã¢ãžã¥ãŒã«åãController ã®ç²åºŠïŒã¯
ASP.NET Core MVC ã§ããã®ãŸãŸéçšãããã
APIã»å±æ§ã»æ€èšŒãŸããã«ã¯å·®ç°ããããåç¯ã§è£è¶³ããã
ãŸããModel ãš View ãš Controller ã®åœ¹å²ã«ã€ããŠæŽçããã
-
Model:
- ã¢ããªã±ãŒã·ã§ã³ã®åºç€ãšãªãããŒã¿æ§é ïŒViewModelïŒã
- ããã³ãã®ããŒã¿ãååŸã»å å·¥ããæ¥åããžãã¯
-
View:
Model ãä¿æããããŒã¿ïŒViewModelïŒãåç §ãããŠãŒã¶ãŒã«è¡šç€ºããã -
Controller:
- ãŠãŒã¶ãŒããã®å ¥åãåãåãã
- Model ã«å¯ŸããŠããŒã¿ã®ååŸã»å å·¥ãæç€ºããã
- ãã®çµæãåããŠãView ã«è¡šç€ºãæç€ºããã
ASP.NET MVC ã®éçºã¯ãViewModel ã® ModelMetadata é§åã«ãªãã
ãã®ãããViewModel ã®èšèšãéèŠã«ãªãããããã
- ç»é¢ãããŒã¹ã«ãããïŒ
- ããŒã¿ã¢ãã«ãããŒã¹ã«ãããïŒ
ã©ã¡ããããŒã¹ã«ãããïŒã§ã¢ãžã¥ãŒã«åãç°ãªã£ãŠããã
-
åè ã¯ãæŽã«ä»¥äžã®ïŒã€ã«åé¡ããããšãã§ããã
- ç»é¢åäœã® Controller ãäœæããå Žåã
ããããå šäœ View ããšã« Controller ãäœæããæ¹åŒããšèšãã - æ©èœåäœã® Controller ãäœæããå Žåã
ããããå šäœ View ããŸãšãã æ©èœåäœã® Controller ãäœæããæ¹åŒããšèšãã
- ç»é¢åäœã® Controller ãäœæããå Žåã
-
åŸè ã§ã¯ãããŒã¿åäœã® Controller ãäœæãããã
ããããã¹ãã£ãã©ãŒã«ãã£ã³ã°æ¹åŒããšèšãã
ãã¹ãã£ãã©ãŒã«ãã£ã³ã°æ¹åŒãã¯è¥å€§ããããåŸåãããã
è£è¶³ïŒãã®è«ç¹ã¯çŸåšãæå¹ïŒ: ãç»é¢ããŒã¹ããããŒã¿ã¢ãã« ããŒã¹ãã
ãšããåãã¯ããã¬ãŒã ã¯ãŒã¯ãåãã
èšèšã®æåã«æ±ºããã¹ãäºæã§ããç¶ããŠããããããŒã¿ã¢ãã« ããŒã¹ïŒã¹ãã£ãã©ãŒã«ãã£ã³ã°ïŒã ãšã³ãã£ã㣠1 ã€ã« Controller 1 ã€ãCRUD 4 ç»é¢ â ç«ã¡äžãããéã â æ¥åãè€éåãããš Controller ãè¥å€§ããïŒåæã®ææéãïŒ â ãç»é¢ = ããŒãã«ãã®å¯Ÿå¿ã厩ãããšç Žç¶»ãã ãç»é¢ïŒæ©èœããŒã¹ã æ¥åã®ãŸãšãŸãããšã« Controller â å®éã®æ¥åã«æ²¿ã â èšèšã«æéãããã**è¿å¹Žã®æœ®æµã¯ãæ©èœïŒãã£ãŒãã£ãŒïŒããŒã¹ã**ã§ã
äŸãã°æ¬¡ã®ãããªæŽçãåºã䜿ãããã
ææ³ å 容 Vertical Slice Architecture æ©èœåäœã§ãã©ã«ããåãïŒController / ViewModel / Handler ãåå± ïŒ Razor Pages ããŒãžåäœïŒ .cshtml+.cshtml.csïŒïŒ ç»é¢ããŒã¹ãã®ãã®Minimal API ãšã³ããã€ã³ãåäœ ç¹ã« Razor Pages ã¯ãåæãèšã
ãå šäœ View ããšã« Controller ãäœæããæ¹åŒãã
ãã¬ãŒã ã¯ãŒã¯ãšããŠæ£åŒåãããã®ãšèšãã
ç»é¢ããŒã¹ãéžã¶ãªã Razor Pages ã®æ¹ãçŽ çŽã§ããã
Model (0..1) <---> (1) å šäœ View
å šäœ View ããModel ãä¿æããããŒã¿ãäœã衚瀺ããªãç¶æ ã(éçãªããŒãžãªã©ïŒ)
å
šäœ View ããModel ãä¿æããããŒã¿ãåç
§ãããŠãŒã¶ãŒã«è¡šç€ºããŠããç¶æ
ã
ãã ããå
šäœ View ãåç
§ã§ããã®ã¯ãModel ã®ããããã£ãã®ã¿ã§ããã
å
šäœ View ããçŽæ¥ Model ã®ã¡ãœãããåŒã¶ããšã¯ããªãã
è£è¶³ïŒãã®å¶çŽã¯éèŠïŒ: ãView ãã Model ã®ã¡ãœãããåŒã°ãªãã
ãšããååã¯ãçŸåšãå®ãã¹ãæéã§ããã@* æªãïŒãã¥ãŒãã DB ãåŒããŠããïŒN+1ãäŸå€åŠçã®æ¬ èœããã¹ãäžèœïŒ *@ @foreach (var id in Model.Ids) { <li>@Repository.Find(id).Name</li> } @* è¯ãïŒå¿ èŠãªããŒã¿ã¯ Controller ã§æã㊠ViewModel ã«èŒãã *@ @foreach (var item in Model.Items) { <li>@item.Name</li> }ASP.NET Core ã«ããã DI ã®
@injectã®ç¯ã§ã
åãæ³šæãããŠããéãã**ãã¥ãŒã¯ã衚瀺ããã ãã**ã«ããã
å šäœ View (1..*) <---> (1) Controller
1 ã€ã® å šäœ View ã«å¯ŸããŠã1 ã€ã® Controller ã察å¿ãããèãæ¹ã
ïŒãå šäœ View ããšã« Controller ãäœæããæ¹åŒã
ãã® å
šäœ View ããã¯ã察å¿ãã Controller ãžã®ã¿ãªã¯ãšã¹ããéãã
Controller ã®åŠçã®çµæã¯ã察å¿ãã å
šäœ View ã«ã®ã¿æç€ºãéãããšãããã®ã
Controller ã®åŠçã®çµæããå¥ã® å
šäœ View ã«è¡šç€ºããããå Žåã¯ã
Controller.RedirectToAction ã¡ãœãããªã©ã䜿çšããŠã
ãã® å
šäœ View ã«å¯Ÿå¿ãã Controller ã«åŠçããªãã€ã¬ã¯ãããã
ä¹±æŽãªèšãæ¹ãããã°ãåŸæ¥ã® ASP.NET ã® WebForm ã«è¿ãèãæ¹ããšèšãããããããªãã
-
ç»é¢ (*.aspx) ããå šäœ View ã«çžåœãã
-
ã³ãŒãããã€ã³ã (*.aspx.cs, *.aspx.vb) ããController ã«çžåœãã
-
ç»é¢ãé·ç§»ãããšãã¯ãResponse.Redirect ã¡ãœããã䜿çšããŠåŠçããªãã€ã¬ã¯ããã
-
ã¡ãªãã
- åŸæ¥ã® ASP.NET ã®çµéšããã人ã«ã¯ããšã£ã€ããããå¯èœæ§ãããã
-
ãã¡ãªãã
- Controller ã¯ã©ã¹ã®æ°ãèšå€§ã«ãªãå¯èœæ§ãããã
è£è¶³ïŒãã®æ¹åŒã¯ Razor Pages ãã®ãã®ïŒ: åæã
ãWeb Forms ã«è¿ãããšè©ããŠãããã®æ¹åŒã¯ã
ASP.NET Core ã® Razor Pages ã§æ£åŒã«ãµããŒãããããPages/ Orders/ Index.cshtml â ç»é¢ Index.cshtml.cs â ãã®ç»é¢å°çšã®ãã³ãã©ãŒïŒPageModelïŒ Edit.cshtml Edit.cshtml.cspublic class EditModel : PageModel { [BindProperty] public OrderVm Order { get; set; } public void OnGet(int id) { ... } // GET public IActionResult OnPost() { ... } // POST }åæãæãããã¡ãªããïŒã¯ã©ã¹æ°ãèšå€§ïŒã¯è§£æ¶ããŠããªããã
1 ç»é¢ = 1 ãã©ã«ãã«ãŸãšãŸãããã
Controller ãå¥ãã©ã«ãã«æ£ãã°ã MVC ããèŠéããè¯ããç»é¢æ°ãå€ãæ¥åã¢ããªã§ã¯ Razor Pagesã
API ããªãœãŒã¹æåãªã MVC / Minimal APIã
ãšããã®ãçŸåšã®äœ¿ãåãã®ç®å®ã§ããã
è€æ°ã® å šäœ View ã«å¯ŸããŠã1 ã€ã® Controller ã察å¿ãããèãæ¹ã
ã¢ããªã±ãŒã·ã§ã³ã®
- æ©èœãã
- ïŒãå šäœ View ããŸãšãã æ©èœåäœã® Controller ãäœæããæ¹åŒã
- ããŒã¿æ§é ã«
察ããŠã1 ã€ã® Controller ã察å¿ãããèãæ¹ã
- ã¡ãªãã
- ãŸãšãŸã£ãæ¥åããšã« Controller ãäœãã®ã§ãController ã®æ°ãæããããã
- ãã¡ãªãã
- è€æ°ã® å
šäœ View ããã®åŠçããã¹ãŠ 1 ã€ã® Controller ã§åãä»ããããã
ãã® Controller ã®ã³ãŒãéãå€ããªãå¯èœæ§ãããã
- è€æ°ã® å
šäœ View ããã®åŠçããã¹ãŠ 1 ã€ã® Controller ã§åãä»ããããã
ç§»è¡ã¡ã¢ïŒéè€ïŒ: åæã¯ãã®ç¯ã®æåã®ç®æ¡æžãã§
ãæ©èœããïŒãå šäœView ããšã« Controller ãäœæããæ¹åŒãããš
èšããŠããããåç¯ã®åç§°ãšéè€ããŠããæèã«åããªãããã
ãå šäœView ããŸãšãã æ©èœåäœã® Controller ãäœæããæ¹åŒã
ïŒæŠèŠç¯ã§äœ¿ãããŠããåŒç§°ïŒã«çµ±äžããã
ããšãã°ãåæ³šåŠçãè¡ãã¢ããªã±ãŒã·ã§ã³ãèãããšã
ãåæ³šäœæç»é¢ãã»ãåæ³šå
å®¹æŽæ°ç»é¢ãã»ãåæ³šåé€ç»é¢ããªã©ã
è€æ°ã® å
šäœ View ã«åãããŠããŠããåããåæ³šãæ¥åïŒå泚ãšã³ãã£ãã£
ã«é¢ãããªã¯ãšã¹ã㯠1 ã€ã® Controller ãåãä»ããããšããèãæ¹ã
-
(1 ã€ã® Model ã«å¯ŸããŠããã® Model ã«é¢ãããªã¯ãšã¹ããåãä»ãã
1 ã€ã® Controllerãããã³ CRUD ãè¡ã 4 ã€ã® å šäœ View ãäœæããã) -
ã¹ãã£ãã©ãŒã«ãã£ã³ã°ã®å ŽåãM/V/C ããããã®å€é床ã¯ã以äžã®ããã«ãªãã
- å
šäœ View (4) <---> (1) Model
(1 ã€ã® Model ã«å¯ŸããŠãCRUD ãè¡ã å šäœ View ãããããäœæããã) - Controller (1) <---> (1) Model
(1 ã€ã® Model ã«å¯ŸããŠããã® Model ã«é¢ãããªã¯ãšã¹ããåãä»ãã Controller ã 1 ã€äœæããã) - å
šäœ View (4) <---> (1) Controller
(CRUD ãè¡ã 4 ã€ã® å šäœ View ã¯ã1 ã€ã® Controller ã«ã®ã¿ãªã¯ãšã¹ããéã)
- å
šäœ View (4) <---> (1) Model
-
ãããã1 ã€ã® å šäœ View ã§ãCRUD å šãŠãå®çŸã§ãã
(CRUD ããšã« å šäœ View ãåãããªã) å Žåã¯ã以äžã®ããã«ãªãã- å šäœ View (1) <---> (1) Model
- Controller (1) <---> (1) Model
- å šäœ View (1) <---> (1) Controller
Controller ãã©ã®ãããªåäœã§äœæãããã«ããã£ãŠããã
- å šäœ View (1..*) <---> (1) Model
- Controller (1) <---> (1..*) Model
- å šäœ View (1..*) <---> (1) Controller
- å šäœ View (1..*) <---> (1) Model
- Controller (1) <---> (1..*) Model
- å šäœ View (1) <---> (1) Controller
ã¢ãžã¥ãŒã«åã®èŠçŽã§ç޹ä»ããã
- æ©èœãããŒã¿æ§é ã«å¯Ÿã㊠1 ã€ã® Controller ã察å¿ãããæ¹åŒ
- å šäœ View ããšã« Controller ãäœæããæ¹åŒ
äœããã®æ¹éã«åãããŠãController ãäœæããã
ç¹å®ã® HTTP ã¡ãœããã®ã¿ãåãå ¥ãã屿§ãä»äžããããšãã§ããã
ãªããAction Method ã« HTTP ã¡ãœãã屿§ãæå®ããªãã£ãå Žåã
Action Method ã¯ããã¹ãŠã® HTTP ã¡ãœãããåãå
¥ããã
AcceptVerbs 屿§ã¯ãè€æ°ã® HTTP ã¡ãœãããåãå ¥ãã Action Method ã®å®çŸ©ã«äœ¿çšããã
- AcceptVerbs 屿§ã¯ã以äžã®ããã«å©çšããã
[AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post)]
public ActionResult XXXXX(ã»ã»ã») { ã»ã»ã» }- 以äžã¯ãAcceptVerbs 屿§ã§äœ¿çšã§ããåæåã®åæåã®äžèЧ
https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.httpverbs
MVC 2 ãã㯠HttpGet, HttpPost, HttpPut, HttpDelete ãšãã 4 ã€ã®å±æ§ã远å ãããã
-
[HttpGet] ã¡ãœãã屿§
- æŠèŠ
- Get ã¡ãœããã®ã¿åãå ¥ããã
- ãã以å€ã® HTTP ã¡ãœããã¯åãå ¥ããªãïŒ404 ãè¿ãïŒã
- ãŠãŒã¹ã±ãŒã¹
- Get ã§å¥ç»é¢ã«ç»é¢é·ç§»ããå Žå
- å ¥åé ç®ãç¡ãç¶æ ã§ãåäžç»é¢å ã§ç¶æ é·ç§»ããå Žå
- æŠèŠ
-
[HttpPost] ã¡ãœãã屿§
- æŠèŠ
- Post ã¡ãœããã®ã¿åãå ¥ããã
- ãã以å€ã® HTTP ã¡ãœããã¯åãå ¥ããªãïŒ404 ãè¿ãïŒã
- ãŠãŒã¹ã±ãŒã¹
- ãã©ãŒã ã®å ¥åé ç®ã Controller ã« Post ããå Žåã
- Post ã§å¥ç»é¢ã«ç»é¢é·ç§»ããå Žåã
- æŠèŠ
-
, etc.
è£è¶³ïŒå±æ§ãæç€ºãã¹ãçç±ïŒ: ãæå®ããªããšå šã¡ãœãããåãå ¥ããã
ãšããæ¢å®ã¯ãã»ãã¥ãªãã£äžã®åŒ±ç¹ã«ãªãåŸãã[HttpPost] ãä»ãå¿ãã Delete ã¢ã¯ã·ã§ã³ â GET /Order/Delete/1 ã§ãªã³ã¯ãèžãã ãã§åé€ã§ããŠããŸã â ã¯ããŒã©ãŒããç»åã¿ã°ïŒ<img src="...">ïŒã§èªçºããã â CSRF 察çïŒ[ValidateAntiForgeryToken](#validateantiforgerytoken屿§)ïŒã GET ã§ã¯å¹ããªãç¶æ ã倿Žããã¢ã¯ã·ã§ã³ã«ã¯å¿ ã
[HttpPost]ïŒãŸã㯠PUT/DELETEïŒãä»ãã
ã®ãååã§ãããASP.NET Core ã§ã®éã:
ASP.NET MVC 5 ASP.NET Core æªæå®æ å šã¡ãœãããåãå ¥ãã åã äžäžèŽæ 404 405 Method Not AllowedïŒããé©åïŒ AcceptVerbsãã ããïŒ [AcceptVerbs("GET","POST")]ïŒè€åæå® HttpVerbs.Get | Post[HttpGet, HttpPost]ãšäžŠã¹ã
Action Method åãšãå€éšã«å ¬éãã Action Name ãšãå¥ã«ããã
äŸãã°
| é çª | Action Method å | ActionName | åŠçã®å 容 |
|---|---|---|---|
| ïŒ | Delete | Delete | åé€ç»é¢ã®åæè¡šç€ºåŠç |
| ïŒ | DeleteConfirmed | Delete | åé€åŠçã®å®è¡ |
è£è¶³ïŒãã®å®åã®æå³ïŒ: äžè¡šã¯
ã¹ãã£ãã©ãŒã«ãã£ã³ã°ãçæããå®çªã®çµã§ãããGET /Order/Delete/1 â Delete(int id) ⊠確èªç»é¢ãåºã POST /Order/Delete/1 â DeleteConfirmed(int id) ⊠å®éã«åé€ããC# ã¯ãåŒæ°ãåãã§æ»ãå€ãåããã¡ãœããã 2 ã€å®çŸ©ã§ããªãããã
ã¡ãœããåãå€ãã[ActionName("Delete")]ã§ URL äžã®ååãæããŠãããASP.NET Core ã§ãåãææ³ã䜿ãããã
Razor Pages ã§ã¯OnGet/OnPostã§èªç¶ã«åããããã
ãã®æå·§ãäžèŠã«ãªãã
CSRF 察çã«äœ¿çšããã
è€æ°ãã©ãŠã¶ãŠã£ã³ããŠå¯Ÿå¿ããªãããŠãããã©ããã¯æªç¢ºèªã
- View
@using (Html.BeginForm())
{
@* ããŒã¯ã³ãåã蟌ã *@
@Html.AntiForgeryToken()
}- Controller
// ããŒã¯ã³ãæ€èšŒãã
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed()
{
ã»ã»ã»
}- åè
- é£èŒïŒASP.NET MVCå
¥éïŒç¬¬4å
ãã£ã«ã¿å±æ§ã«ããèªèšŒïŒãã£ãã·ã¥ïŒã»ãã¥ãªãã£å¯Ÿçã®å®è£ (5/5) - ïŒ IT
http://www.atmarkit.co.jp/ait/articles/0908/14/news041_5.html - ASP.NET ã®ã»ãã¥ãªãã£å¯Ÿçã«ã€ããŠèãã - ãã°ããéèš
http://blog.shibayan.jp/entry/20120526/1338001863 - ASP.NET ã®çµã¿èŸŒã¿æ©èœã掻çšããWeb æ»æãåé¿ãã
https://learn.microsoft.com/ja-jp/archive/msdn-magazine/2005/january/build-secure-asp-net-applications
- é£èŒïŒASP.NET MVCå
¥éïŒç¬¬4å
è£è¶³ïŒåæã®çåãžã®åçãšãçŸåšã®æ¢å®ïŒ: åæã
ãè€æ°ãã©ãŠã¶ãŠã£ã³ããŠå¯Ÿå¿ããªãããŠãããæªç¢ºèªããšããŠããç¹ã«ã€ããŠã察å¿ããŠãããASP.NET ã®åœé 鲿¢ããŒã¯ã³ã¯
Cookie åŽãšãã©ãŒã åŽã® 2 ã€ãçªãåãããæ¹åŒ
ïŒDouble Submit Cookie ç³»ïŒã§ã
ã¿ãããŠã£ã³ããŠããšã«å€ãå€ããããã§ã¯ãªãããã
è€æ°ãŠã£ã³ããŠãéããŠãåé¡ã¯èµ·ããªããCookie: __RequestVerificationToken=ïŒæå·åãããå€ïŒ Form: __RequestVerificationToken=ïŒå¯Ÿã«ãªãå€ïŒ â äž¡æ¹ãæãããã€å¯Ÿå¿ããŠããããšãæ€èšŒãã â Cookie ã¯ãã©ãŠã¶åäœãªã®ã§ãã¿ãéã§å ±éãã ããèªèšŒç¶æ ãå€ãããšå€ãå€ããããã
ãå¥ã¿ãã§ãã°ã¢ãŠãããåŸãå€ãã¿ããã POST ãããšå€±æããã
ãšããçŸè±¡ã¯èµ·ããåŸããASP.NET Core ã§ã®éã:
ASP.NET MVC 5 ASP.NET Core ããŒã¯ã³ã®åã蟌㿠@Html.AntiForgeryToken()ãå¿ èŠ<form>ã¿ã° ãã«ããŒãèªåã§åãèŸŒãæ€èšŒ [ValidateAntiForgeryToken]ãä»ããæ¢å®ã§èªåæ€èšŒïŒ [AutoValidateAntiforgeryToken]çžåœïŒé€å€ ïŒ [IgnoreAntiforgeryToken]屿§å ValidateAntiForgeryTokenValidateAntiForgeryTokenïŒååïŒ@* ASP.NET CoreïŒããã ãã§ããŒã¯ã³ãåã蟌ãŸãã *@ <form asp-action="Delete" method="post">ãä»ãå¿ãããèµ·ãã«ãããªã£ãã®ã倧ããªæ¹åã§ããã
APIïŒJSONïŒã§ Cookie èªèšŒã䜿ãå Žåã¯ã
ããããŒçµç±ã§éãèšå®ãå¥éèŠããbuilder.Services.AddAntiforgery(o => o.HeaderName = "X-CSRF-TOKEN");
ã¢ãžã¥ãŒã«åã®èãæ¹ã®ããã«ãModel ã«ã¯ 2 ã€ã®æå³ãããã
-
ã¢ããªã±ãŒã·ã§ã³ã®åºç€ãšãªãããŒã¿æ§é
- POCO ãšããŠäœæããã
- XXXXViewModel ãšããåç§°ãä»äžããã
-
ãã®ããŒã¿ãååŸã»å å·¥ããæ¥åããžãã¯
- éåžžã®æ¥åããžãã¯ã»ã¯ã©ã¹ãšããŠäœæããã
ã³ã³ã§ã¯åè ã«ã€ããŠèšåããã
è£è¶³ïŒViewModel ãåããæçŸ©ïŒ: ãXXXXViewModel ãšããåç§°ãä»äžããã
ãšããåæã®æéã¯ãASP.NET MVCã®çšèª ã§è¿°ã¹ã
ãªãŒããŒãã¹ãã£ã³ã°æ»æã®å¯Ÿçã§ãããããšã³ãã£ãã£ïŒDB ã®ããŒãã«ã«å¯Ÿå¿ïŒ â è©°ãæ¿ãïŒAutoMapper / ææžã / MapperlessïŒ ViewModelïŒç»é¢ã«å¿ èŠãªé ç®ã ãïŒ â ã¢ãã« ãã€ã³ãã£ã³ã° HTTP ãªã¯ãšã¹ããšã³ãã£ãã£ãçŽæ¥ãã€ã³ãããªãããšã§ã
- å±éºãªé ç®ïŒ
IsAdminãCreatedAtçïŒãããããååšããªã- ç»é¢åºæã®é ç®ïŒç¢ºèªçšãã¹ã¯ãŒãã衚瀺çšã©ãã«ïŒãæãŠã
- DB ã®ã¹ããŒã倿Žãç»é¢ã«æ³¢åããªã
ãšããå©ç¹ãåŸãããã
System.ComponentModel.DataAnnotations 屿§ã«ããã
- æ€èšŒæ©èœ
- ãã³ãã¬ãŒãã»ãã«ããŒãšåŒã°ãã Html ãã«ããŒ
- Controller ã®ã¹ãã£ãã©ãŒã«ãã£ã³ã°çæ
ã®åäœãå¶åŸ¡ããäºãã§ããã
- åè
- 第3åãã¢ãã«ã»ãã€ã³ããšã¢ãããŒã·ã§ã³æ€èšŒã®å®è£
ïŒ ïŒ IT
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_04/aspnetmvc3_04_01.html - 第6åããã³ãã¬ãŒãæ©èœã§ãã¥ãŒéçºãå¹çå ïŒ ïŒ IT
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_07/aspnetmvc3_07_01.html - ASP.NET MVC ã® ModelMetadata ã¯å¥¥ãæ·±ã - ãã°ããéèš
http://blog.shibayan.jp/entry/20120108/1326030354
- 第3åãã¢ãã«ã»ãã€ã³ããšã¢ãããŒã·ã§ã³æ€èšŒã®å®è£
ïŒ ïŒ IT
åæ å ±ãæå®ããããšã§ã
- 衚瀺ã«é¢ããå¶åŸ¡å±æ§
- æ±çšçãªæ€èšŒå±æ§
ãšããŠäœ¿çšãããã
[DataType(DataType.XXXX)]-
åè
- DataType åæäœ (System.ComponentModel.DataAnnotations)
https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.datatype- Password åæå
- Text åæå
- Url åæå
- ImageUrl åæå
- MultilineText åæå
- EmailAddress åæå
- PhoneNumber åæå
- PostalCode åæå
- Currency åæå
- CreditCard åæå
- Date åæå
- Time åæå
- DateTime åæå
- Duration åæå
- Html åæå
- Upload åæå
- Custom åæå
- DataType åæäœ (System.ComponentModel.DataAnnotations)
è£è¶³ïŒ
DataTypeã¯ãæ€èšŒãã§ã¯ãªãç¹ã«æ³šæïŒ: åæã¯
ãæ±çšçãªæ€èšŒå±æ§ãšããŠäœ¿çšãããããšããŠãããã
[DataType]åäœã§ã¯æ€èšŒã¯è¡ãããªãïŒè¡šç€ºã®ãã³ããäž»ç®çïŒã[DataType(DataType.EmailAddress)] // â æ€èšŒããªãïŒtype="email" ã«ãªãã ãïŒ public string Email { get; set; } [EmailAddress] // â ãã¡ããæ€èšŒãã public string Email { get; set; }
[EmailAddress]/[Phone]/[Url]ãªã©ã®
DataType掟ç屿§ã¯æ€èšŒãè¡ãïŒåŸè¿°ã®DataType ã®æŽŸçã®å±æ§ïŒã
åæãåŸæ®µã®DataType 屿§ã®ç¯ã§
ãDataType 屿§ãæ€èšŒå±æ§ãšããŠæ©èœããããšè¿°ã¹ãŠããã®ã¯ã
æ£ç¢ºã«ã¯ãã®æŽŸç屿§ãæããŠãããšèªãã®ã劥åœã§ããã
DataType 屿§ãšåæ§ã«å©çšãããã
-
åè
-
ASP.NET MVCã®ã¢ãã«ã§ãã䜿ã屿§ïŒã¢ãããŒã·ã§ã³ïŒãªã¹ã - Qiita
http://qiita.com/mrpero/items/607c31895d77815a77cb -
DataTypeAttribute ã¯ã©ã¹ (System.ComponentModel.DataAnnotations)
https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.datatypeattribute- CreditCard 屿§
- EmailAddress 屿§
- EnumDataType 屿§
- FileExtensions 屿§
- Phone 屿§
- Url 屿§
-
衚瀺åïŒLabel 衚瀺ãè¡ãªã Html ãã«ããŒã«äœ¿çšãããïŒ
-
DisplayName
[DisplayName("xxxx")]
-
Display
- Name
[Display(Name = "xxxx")]
- ResourcesTypeïŒåœéå察å¿çšïŒ
[Display(Name = "xxxx", ResourceType = typeof(yyyy))]
- Name
è£è¶³ïŒ
ResourceTypeã¯ãªãœãŒã¹ ãã¡ã€ã«ãšé£æºããïŒ: ããã
åœéå察å¿ã®å ¥å£ã«ãªãã
ResourceTypeã«æå®ããã®ã¯ã.resxããçæããã
å³å¯ã«åæå®ããããªãœãŒã¹ ã¯ã©ã¹ã§ããã[Display(Name = "UserName", ResourceType = typeof(Resources.Labels))] public string UserName { get; set; } // â Labels.ja.resx ã® "UserName" ã䜿ããã詳现㯠ãªãœãŒã¹ãã¡ã€ã«ã
ããã³ ASP.NET MVCã®åœéå察å¿ãåç §ãASP.NET Core ã§ã¯
IStringLocalizeræ¹åŒãéžã¹ããbuilder.Services.AddMvc() .AddDataAnnotationsLocalization(); // æ€èšŒã¡ãã»ãŒãžã localize ããã
ãã©ãŒãããã®æå®ã
[DisplayFormat(DataFormatXXXX="YYYY")]- DisplayFormatAttribute ã¯ã©ã¹ (System.ComponentModel.DataAnnotations)
https://learn.microsoft.com/ja-jp/dotnet/api/system.componentmodel.dataannotations.displayformatattribute- DataFormatStringïŒæžåŒæå®æååïŒ
- ApplyFormatInEditModeïŒç·šéã¢ãŒãã§æžåŒãé©çšãããã©ããïŒ
- NullDisplayTextïŒnull ã®å Žå衚瀺ããããã¹ãïŒ
- ConvertEmptyStringToNullïŒç©ºæååã null ã«å€æïŒ
- , etc.
- ç¬èªã®è¡šç€º/ç·šéãã³ãã¬ãŒãã»ãã«ããŒãæºåããã
- äŸãã° DateTime åãæå®ãã EditorFor ã§
䜿çšãã jQuery UI ã® Datepicker ãé©çšããã
è£è¶³:
<input type="date">ãå šãã©ãŠã¶ã§äœ¿ããããã«ãªã£ãããã
jQuery UI ã® Datepicker ãåœãŠãå¿ ç¶æ§ã¯èããŠãã
ïŒjQuery UI èªäœãéçºçµäºãASP.NET ã® Modernization åç §ïŒã[DataType(DataType.Date)] [DisplayFormat(DataFormatString = "{0:yyyy-MM-dd}", ApplyFormatInEditMode = true)] public DateTime BirthDate { get; set; } // â EditorFor ã§ <input type="date"> ãåºåããã
- Model éã® Relation ãèšå®ããéãModel ã®è¡šç€ºåã«äœ¿çšããŠãã Columnã
- Model éã® Relation ã¯ãããã²ãŒã·ã§ã³ã»ããããã£ã§èšå®ããã
æ€èšŒå±æ§ã«ã€ããŠã¯ãã³ãã©ã
AutoMapperã䜿çšããã
åºæ¬ãRazorïŒäž»æµïŒã䜿çšããã
ç§»è¡ã¡ã¢ïŒè¡šèšïŒ: åæã®ãRazerã㯠Razor ã®èª€èšãšå€æãä¿®æ£ããã
ASP.NET MVC ã«ã¯ã<form> ã¿ã°ãçæãã Html ãã«ããŒã 2 çš®é¡ããã
BeginForm ãã«ããŒã¯åŒæ°ã«ã³ã³ãããŒã©ãŒåãã¢ã¯ã·ã§ã³åãä»äžã§ãã
æå®ããã¢ã¯ã·ã§ã³ã¡ãœããã«ãªã¯ãšã¹ããéãããšãã§ããã
éåžžã® <form> ã¿ã°ãçæããå Žåã«äœ¿çšããã
-
å šäœæŽæ°ã倿°ãå ããå Žå (ã¢ã¯ã·ã§ã³ã¡ãœããã®çµæãšããŠãView å šäœãæŽæ°ããå Žå)ã
-
ç»é¢ãªãã¬ãã·ã¥ã«ããããªã¯ãšã¹ãã»ã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ãæç¢ºã«ãããå Žåã
<form> ã¿ã°ã« Ajax ãªã¯ãšã¹ãçšã®å±æ§ãä»äžããããªã¯ãšã¹ããéåæã§åŠçãããã
-
éšåæŽæ°ã倿°ãå ããå Žå (ã¢ã¯ã·ã§ã³ã¡ãœããã®çµæãšããŠãView ã®äžéšåã®ã¿ãæŽæ°ããå Žå)ã
-
ãµãŒããŒåŽåŠçãéåžžã«éãæ¥åã®å Žå (Ajax ã¯éåæåŠçã®ãã)ã
-
ç»é¢å ¥åç¶æ ãä¿æãããŸãŸ POST éä¿¡ãããå Žå
- ViewStateããµããŒããããªã MVC ã§ãæ å ±åŸ©å åŠçã岿ãããå Žåã
-
ãªã¯ãšã¹ãã»ã¬ã¹ãã³ã¹ã®ãµã€ãºãåæžããŠãæ§èœåäžãå³ãããå Žåã
-
ç»é¢ãªãã¬ãã·ã¥ã«ãããç»é¢ã®ã¡ãã€ããªã©ããªããããå Žåã
è£è¶³ïŒ
Ajax.BeginFormã¯å»æ¢æžã¿ïŒ: éšåæç»ãšJavaScript ã§
è¿°ã¹ãéããAjax.BeginForm㯠ASP.NET Core MVC ã«
ç§»æ€ãããªãã£ããåæãæããå©ç¹ã¯ãçŸåšã¯æ¬¡ã®ææ®µã§åŸãã
åæã®å©ç¹ çŸåšã®ææ®µ éšåæŽæ° fetch+ éšåãã¥ãŒãhtmxãSPAãBlazoréãåŠçã®éåæå async/awaitïŒãµãŒãåŽïŒïŒ é²æè¡šç€º å ¥åç¶æ ã®ä¿æ ã¯ã©ã€ã¢ã³ãåŽã§ç¶æ ãæã€ïŒReact/Vue/BlazorïŒ éä¿¡éã®åæž JSON APIïŒHTML æçããå°ããïŒ ã¡ãã€ãã®åé¿ åäž ããµãŒããŒåŽåŠçãéåžžã«éãæ¥åãã« Ajax ã䜿ããšããçºæ³ã¯ã
çŸåšã§ã¯éåæãžã§ã + 鲿ããŒãªã³ã° / SignalR ã§
解決ããæ¹ãé©åãªå Žåãå€ã
ïŒHTTP ãªã¯ãšã¹ããé·æéä¿æããã®ã¯é¿ããïŒã
-
ajaxã®äœ¿ãã©ãã
http://okwave.jp/qa/q8112782.html -
Html.BeginForm() vs Ajax.BeginForm() in MVC3 - CodeProject
http://www.codeproject.com/Articles/429164/Html-BeginForm-vs-Ajax-BeginForm-in-MVC3
ç»é¢èšèšã«ãããã以äžãèæ ®ããã
- 1 View ã«å¯Ÿã㊠1 FormïŒ
- 1 View ã«å¯ŸããŠè€æ° FormïŒ
è€æ° Form ã®å Žå㯠Form ããã¹ããããªãããšã
ïŒ HTML ã®ä»æ§ã§ Form ã®ãã¹ãã¯çŠæ¢ãããŠããã
ç§»è¡ã¡ã¢ïŒèª€èšïŒ: åæã®èŠåºããFrom ã¿ã°ã®åãæ¹ãã¯
Form ã®èª€èšãšå€æãä¿®æ£ããã
-
Html.xxxxFor
- ãã¹ãæã« Model ããŒã¿ã埩å ããå Žåã
- äŸãã°ãšã©ãŒçºçæã«ãèªç»é¢ã®å衚瀺ïŒâãã¹ãããã¯ïŒãããå Žåã
-
Html.xxxx
äžèšä»¥å€ã¯ãHtml.xxxx ã§è¯ãã
ASP.NET MVC ã§äžèЧïŒã°ãªããïŒã®ãã View ãäœæããå Žåã以äžã® 3 çš®é¡ãèããããã
-
WebGrid ã¯ã©ã¹ã䜿çšãã
ãœãŒããããŒãžã³ã°ã容æã«å®è£ ã§ããåé¢ãã¬ã³ããªã³ã°éšåã¯å€å°ãã©ãã¯ããã¯ã¹ã«ãªã -
<table> ã¿ã°ãèªåã§çæãã<tr> ã¿ã°ãã«ãŒãã§å®è£ ãã
ASP.NET ã® Repeater ã³ã³ãããŒã«ã®ãããªåŠçã®å®è£ æ¹æ³ïŒRazor ãªã¶ã楜ïŒã -
jqGrid ãªã©ãOSS ã® JavaScript ã©ã€ãã©ãªã䜿çšããã
è£è¶³ïŒçŸåšã®éžæè¢ïŒ: WebGridïŒ
System.Web.HelpersïŒã¯
ASP.NET Core ã«ã¯ç¡ããçŸåšã®äžèŠ§è¡šç€ºã®éžæè¢ã¯æ¬¡ã®éãã
ææ®µ ç¹åŸŽ foreachã§<table>ãæžãæãçŽ çŽãå¶åŸ¡ãå®å š JS ã®ã°ãªãã ã©ã€ãã©ãª AG GridãTabulatorãDataTablesïŒjQueryïŒ Blazor ã® QuickGrid.NET 8 æšæºãC# ã ãã§æžãã ããŒãžã³ã°æ¯æŽ X.PagedListãèªååæã® 3 åé¡ã¯ãã®ãŸãŸæå¹ã§ã
**ããã©ãã¯ããã¯ã¹ãé¿ããèªåã§æžãã**ã
çŸåšã®äž»æµã§ããç¹ãå€ãã£ãŠããªãã
DisplayFor ã EditorFor ãªã©ã¢ãã«å®çŸ©ã«å¿ããŠåºåãèªåšã«å€ãããã Html ãã«ããŒã
- Html ãã«ããŒ
-
DisplayForãDisplayForModelïŒããŒã¿ã®è¡šç€º
- DisplayForïŒ
- DisplayForModelïŒModel åäœã«ãã³ãã¬ãŒãã»ãã«ããŒã決å®ããã
-
EditorForãEditorForModelïŒããŒã¿ç·šéé ç®ã®çæ
- EditorForïŒ
Html ãã«ããŒã®ç¬¬äºåŒæ°ã§ãã³ãã¬ãŒãã»ãã«ããŒãæå®ã§ããã
UIHint 屿§ã§æå®ãããã³ãã¬ãŒãã»ãã«ããŒã䜿çšãããã
屿§ã®åªå 床ã¯ãUIHint 屿§ -> DataType 屿§ -> å®éã®ããŒã¿å - EditorForModelïŒModel åäœã«ãã³ãã¬ãŒãã»ãã«ããŒã決å®ããã
- EditorForïŒ
-
ç§»è¡ã¡ã¢ïŒè¡šèšïŒ: åæã®ãEditForãEditForModelãã¯
EditorFor/EditorForModelã®èª€èšãšå€æãä¿®æ£ããã
-
ãã³ãã¬ãŒãã»ãã«ããŒåãšãã³ãã¬ãŒãã»ãã«ããŒé çœ®å Žæ
- DisplayTemplates
- ~/View/Shared/DisplayTemplates/DataTypeå or Modelå.cshtml
- ~/View/Controllerå/DisplayTemplates/DataTypeå or Modelå.cshtml
- EditorTemplates
- ~/View/Shared/EditorTemplates/DataTypeå or Modelå.cshtml
- ~/View/Controllerå/EditorTemplates/DataTypeå or Modelå.cshtml
- DisplayTemplates
-
åè
- Razor - Build Insider
- ãã³ãã¬ãŒãé¢é£ã®ãã¥ãŒãã«ããŒïœãã³ãã¬ãŒãã®æšæºã®æå
https://www.buildinsider.net/web/bookaspmvc5/040401 - ãã³ãã¬ãŒãã®ã«ã¹ã¿ãã€ãºïœãã³ãã¬ãŒããæ±ºå®ããæ¹æ³
https://www.buildinsider.net/web/bookaspmvc5/040402 - ã¢ãã«åäœã«ãã³ãã¬ãŒããæ±ºå®ãã - DisplayForModelïŒEditorForModelã¡ãœãã
https://www.buildinsider.net/web/bookaspmvc5/040404
- ãã³ãã¬ãŒãé¢é£ã®ãã¥ãŒãã«ããŒïœãã³ãã¬ãŒãã®æšæºã®æå
- Razor - Build Insider
è£è¶³ïŒãã®ä»çµã¿ã¯ ASP.NET Core ã«ãããïŒ:
DisplayTemplates/
EditorTemplates㯠ASP.NET Core ã§ãåãèŠçŽã§åã
ïŒçœ®ãå ŽæãViews/Shared/é äžã§ããç¹ãåãïŒãViews/Shared/EditorTemplates/DateTime.cshtml Views/Shared/DisplayTemplates/Boolean.cshtmlãã ãçŸåšã¯ãã¿ã° ãã«ããŒã
Blazor ã®ã³ã³ããŒãã³ãã®æ¹ã
ãéšåãäœã£ãŠäœ¿ãåããææ®µãšããŠèªç¶ã§ããã
ãã³ãã¬ãŒãã»ãã«ããŒã®åºçªã¯æžã£ãŠããã
Html.Hidden ãŸã㯠Html.HiddenFor
ã¿ã€ã ã¹ã¿ã³ãåãªã©ããŠãŒã¶ã«èŠããªãæ
å ±ã ã
å
éšåŠçã«å¿
èŠãªæ
å ±ãåŒãç¶ãå Žåã«äœ¿çšããã
è£è¶³ïŒHidden ã¯æ¹ç«ãããåæã§æ±ãïŒ: ViewState ãšéãã
MVC ã® Hidden ã«ã¯æ¹ç«æ€ç¥ãç¡ãã<input type="hidden" name="Price" value="1000"> â éçºè ããŒã«ã§æžãæã㊠POST ã§ããéé¡ã»æš©éã»ææè ID ãªã©ã Hidden ã«çœ®ããŠã¯ãªããªãã
**楜芳çåæå®è¡å¶åŸ¡ã®ã¿ã€ã ã¹ã¿ã³ãïŒRowVersionïŒ**ã®ããã«ã
æ¹ç«ãããŠã害ãç¡ãïŒãµãŒãåŽã§å¿ ãæ€èšŒããïŒãã®ã«éãã// RowVersion ã¯æ¹ç«ãããŠããæŽæ°ã倱æãããã ããªã®ã§å®å š [Timestamp] public byte[] RowVersion { get; set; }
- åè
-
ASP.NET MVC 5 éçºã¡ã¢ > ãã¥ãŒãã«ããŒãèªäœãã
http://aspmvc.tokumori-domain.com/view/crt_viewhelper/ -
第6åããã³ãã¬ãŒãæ©èœã§ãã¥ãŒéçºãå¹çåïŒ3/3ïŒ - ïŒ IT
http://www.atmarkit.co.jp/fdotnet/aspnetmvc3/aspnetmvc3_07/aspnetmvc3_07_03.html
-
ã¢ãžã¥ãŒã«åã®èŠçŽã§ç޹ä»ããã
å ±ã«ãç»é¢é·ç§»ã®åŠçãããŒã¯ä»¥äžã®ããã«ãªãã
- View ããã察å¿ãã Controller ã«ãªã¯ãšã¹ããéã
- Controller ã¯ãªã¯ãšã¹ããåãä»ããModel ã«åŠçãæç€ºãã
- Model ã¯æ¥åããžãã¯ãå®è¡ããããŒã¿ãæŽæ°ãã
- Controller 㯠View ã«è¡šç€ºãæç€ºãã
ãªãã1 ã€ã® View ããä»»æã® Controller ã« POST ãªã¯ãšã¹ããéã
ASP.NET Web Formsã®ãããŒãžéãã¹ãã£ã³ã°ãçãªå®è£
ãæžãããã
View ãš Controller ã®é¢ä¿ãè€éã«ãªãã®ã§ãªã¹ã¹ã¡ããªãã
åŸã£ãŠãäžèšã®ã4.ãã§ãã©ã® View ã«è¡šç€ºã®æç€ºããããã«ãã£ãŠã
䜿çšãã ActionResult ã¯ã©ã¹ãäžèšã®ããã«å€ããæ§ã«å®è£
ããã
- ãã® Controller ã«å¯Ÿå¿ãã View ã«ã衚瀺ãæç€ºããå Žå
- ViewResult ã䜿çšãã
- å¥ã® Controller ã«å¯Ÿå¿ãã View ã«ã衚瀺ãæç€ºããå Žå
- RedirectToActionResult ãŸã㯠RedirectToRouteResult ã䜿çšãã
è£è¶³ïŒPost/Redirect/Get ãã¿ãŒã³ïŒ: ãã®ç¯ãè¿°ã¹ãŠããã®ã¯ã
äžè¬ã« PRGïŒPost/Redirect/GetïŒãã¿ãŒã³ãšåŒã°ããå®ç³ã§ãããPOST /Order/Create â æåããã RedirectToAction("Index") â 302 ãè¿ã â ãã©ãŠã¶ã GET /Order/Index ãå®è¡ ããããããªããšã POST ã®çµæãçŽæ¥ View ã§è¿ã â ãã©ãŠã¶ã§ F5ïŒåèªã¿èŸŒã¿ïŒãããšãåéä¿¡ããŸããïŒã â OK ãããšäºéç»é²æŽæ°ç³»ã¯å¿ ããªãã€ã¬ã¯ãã§çµããããšããã®ãååã§ããã
ãªãã€ã¬ã¯ãå ãžã®ã¡ãã»ãŒãžåãæž¡ãã«ã¯
TempDataïŒASP.NET MVCã®çšèªïŒã䜿ãã
ãã¢ãã€ã« ã¢ããªã±ãŒã·ã§ã³ããã³ãã¬ãŒãã䜿çšããŠã
ã¢ãã€ã«ããã€ã¹åãã¢ããªã±ãŒã·ã§ã³ãäœæã§ããã
ãã®ãã³ãã¬ãŒãã§ã¯ãjQuery Mobile ãããŒã¹ãšããŠããã
ã¿ããæäœã«æé©åãã UI ãæ§ç¯ã§ããã
Bootstrap ã«ããã¬ã¹ãã³ã·ããã¶ã€ã³ã«é Œããã
PC åããµã€ããã¢ãã€ã«åããµã€ãã®ç»é¢ãåããã¢ãããŒãã
-
Desktop ã Mobile ãã¯ãUserAgent ã UserHostAddress ã䜿çšããŠå€å¥ããŠããã
-
éåžžãXXXXX.cshtml ãš XXXXX.Mobile.cshtml ã®ïŒã€ã® View ã¹ã¯ãªãããäœæããã
äžèšã¯ããã¹ã¿ããŒãžãéšå View ãªã©ã® View ã¹ã¯ãªããã«ãé©çšããããšãã§ããã- XXXXX.cshtml (PC åããµã€ã)
- XXXXX.Mobile.cshtml (ã¢ãã€ã«åããµã€ã)
-
以äžã®ã³ãŒãã远å ããŠããã€ã¹ããšã« XXXXX.YYYYY.cshtml ãš View ã¹ã¯ãªããã远å ããã
- Global.asax ã® Application_Start ã¡ãœããã«å®çŸ©ããã
protected void Application_Start()
{
(äžç¥)
DisplayModeProvider.Instance.Modes.Insert(0, new DefaultDisplayMode("iPhone")
{
ContextCondition = (context => context.GetOverriddenUserAgent()
.IndexOf("iPhone", StringComparison.OrdinalIgnoreCase) >= 0)
});
}ãã®æã
- ãXXXXX.cshtmlããšåããã©ã«ãã«
- ãXXXXX.iPhone.cshtmlããäœæãã
iPhone åãã®ã¬ã€ã¢ãŠããå®çŸ©ãããšã
http://server/application/Controller/Index/id
ãšããåã URL ã«å¯Ÿãã
- PC ã®ãã©ãŠã¶ããã¢ã¯ã»ã¹ããå ŽåããIndex.cshtmlãã䜿çšããã
- iPhone ããã¢ã¯ã»ã¹ããå Žåã¯ãIndex.iPhone.cshtmlãã䜿çšãããããã«ãªãã
ç§»è¡ã¡ã¢ïŒè¡šèšïŒ: åæã®ãMobilã㯠Mobile ã®
ç¶Žãã®èª€ããšå€æãä¿®æ£ããã
è£è¶³ïŒãã®æ¹åŒã¯çŸåšã¯äœ¿ãããªãïŒææ°åïŒ:
DisplayModesã¯
ASP.NET Core MVC ã«ã¯ç§»æ€ãããªãã£ãããåœæãPC çšãµã€ããšã¢ãã€ã«çšãµã€ããåãã â UserAgent ã§å€å¥ïŒm.example.com æ¹åŒãåæä»£ïŒ â ç»é¢ã 2 系統ã«ãªããä¿å®ãåã«ãªã ãçŸåšãã¬ã¹ãã³ã·ã ãã¶ã€ã³ 1 æ¬ â CSS ã®ã¡ãã£ã¢ ã¯ãšãªã§åºãåãã â Google ããã¢ãã€ã« ãã¡ãŒã¹ã ã€ã³ããã¯ã¹ãã§ åäž URLã»åäž HTML ãæšå¥šUserAgent ã«ããå€å¥èªäœãæšå¥šãããªã
ïŒæ°æ©çš®ã®ãã³ã«æ¡ä»¶ãå¢ãããåœè£ ãããã
ãã©ãŠã¶åŽã UA æååã®çž®å°ãé²ããŠããïŒãjQuery Mobile ã 2021 幎ã«éçºçµäºããŠããã
ãã¢ãã€ã« ã¢ããªã±ãŒã·ã§ã³ ãã³ãã¬ãŒãããçŸåããªããã©ãããŠãåºãåããå¿ èŠãªå Žåã¯ã
- CSS ã®ã¡ãã£ã¢ ã¯ãšãª / ã³ã³ãã ã¯ãšãªïŒç¬¬äžåè£ïŒ
- ã¯ã©ã€ã¢ã³ã ãã³ãïŒ
Sec-CH-UA-MobileããããŒïŒã䜿ãã
ãã®ã¯ã©ã¹ã§èšå®ã»è¿œå ããããããã£ãã
å View ãã¡ã€ã«(.cshtml ã .vbhtml)ã®éçºæã«äœ¿çšåºæ¥ãããã«ãªãã
- ASP.NET MVC 5 / Core MVCã§ç¬èªã®ãã¥ãŒããŒãžã®ã¯ã©ã¹ã䜿çšãã - Qiita
https://qiita.com/taiga_takahari/items/1c788ac91b62324a9140
è£è¶³: ASP.NET Core ã§ã¯
RazorPage<TModel>ãç¶æ¿ãã
_ViewImports.cshtmlã®@inheritsã§æå®ããã
ãã ãçŸåšã¯ã@injectã«ãã DI ã®æ¹ã
çŽ çŽãªè§£æ±ºææ®µã§ããããšãå€ã
ïŒASP.NET Core ã«ããã DIïŒã
å©çšäžå¯èœ
-
å¿ èŠã§ããã°ãViewStateçžåœã®ç¶æ ä¿ååŠçãç¬èªå®è£ ããå¿ èŠãããã
-
For ä»ãã® Html ãã«ããŒïŒHtml.xxxxForïŒã䜿çšããã°ã
åæ¹åãã€ã³ãã£ã³ã°ã«ãããã¹ãããã¯ã®ç¯å²ã§å€ã¯ç¶æãããïŒã
Hidden
䜿çšå¯èœ
䜿çšå¯èœ
è£è¶³ïŒMVC ã§ ViewState ãç¡ãããšã®æå³ïŒ: ããã¯
æ¬ èœã§ã¯ãªãèšèšå€æã§ããã
ViewState ããïŒWeb FormsïŒ ç¡ãïŒMVCïŒ ç¶æ ã®ä¿æ èªåïŒãã¬ãŒã ã¯ãŒã¯ãé èœïŒ æç€ºçã«æžã ããŒãž ãµã€ãº è¥å€§ããïŒæ°çŸ KB ã«ãªãããšãïŒ å°ãã æ¹ç«æ€ç¥ ããïŒMAC 眲åïŒ ç¡ãïŒèªåã§æ€èšŒïŒ ã¹ããŒãã¬ã¹æ§ äœã é«ãïŒã¹ã±ãŒã«ããããïŒ åŠç¿ã³ã¹ã äœãïŒããå éšãèŠããªãïŒ é«ãïŒããèŠéããè¯ãïŒ MVC ã ViewState ãæããªãããšã§ã
HTTP ã®ã¹ããŒãã¬ã¹æ§ã«çŽ çŽãªèšèšã«ãªã£ãã
ãã㯠ASP.NET Core ã®ã¹ã±ãŒã©ããªãã£ã«ãç¹ãã£ãŠãã
ïŒASP.NET Coreã®åæ£ãã£ãã·ã¥ïŒããªããSession ã䜿ããšã¹ããŒãã¬ã¹æ§ãæãªãããããã
è€æ°å°æ§æã§ã¯åæ£ãã£ãã·ã¥ãå¿ èŠã«ãªãã
å¯èœãªã Session ã䜿ããªãïŒããŒã¯ã³ã«èŒãããDB ããåŒãïŒ
ãšããã®ããããçŸä»£çãªèšèšã§ããã
Action ã¡ãœããå
ã§åå¥ã«ãã§ãã¯ããžãã¯ãå®è£
ãããã
ModelMetadata ã䜿çšãããã§ãã¯ãå¯èœã
以äžã®å±æ§ã䜿çšããŠæ€èšŒå¯èœã
| é çª | 屿§ | æŠèŠ |
|---|---|---|
| ïŒ | DataType 屿§(enumDataType, errmsg) | æå®ã®ããŒã¿åã«å€æå¯èœã |
| ïŒ | Required 屿§(errmsg) | å¿ é å ¥å |
| ïŒ | StringLength 屿§(max, errmsg) | æååã®æå€§é· |
| ïŒ | MaxLength 屿§(max, errmsg) | æååã®æå€§é· |
| ïŒ | MinLength 屿§(min, errmsg) | æååã®æå°é· |
| ïŒ | Range 屿§(min, max, errmsg) | ç¯å² |
| ïŒ | RegularExpression 屿§(pattern, errmsg) | æ£èŠè¡šçŸ |
| ïŒ | MembershipPassword 屿§() | ãã¹ã¯ãŒã |
| ïŒ | Compare 屿§(targetname, errmsg) | æ¯èŒïŒe-mail ã passwd ã®ç¢ºèªçšãã£ãŒã«ãã«äœ¿çšããïŒ |
| 10 | Remote 屿§(actionMethod, errmsg) | Ajax ã䜿çšãããã§ã㯠|
| 11 | CustomValidation 屿§() | ã«ã¹ã¿ã |
å屿§ã® errmsg ããããã£ã«äœãèšå®ããªããŠãæ¢å®ã§ãšã©ãŒã¡ãã»ãŒãžãåºãã
- åè
- ASP.NET MVCã®ã¢ãã«ã§ãã䜿ã屿§ïŒã¢ãããŒã·ã§ã³ïŒãªã¹ã - Qiita
http://qiita.com/mrpero/items/607c31895d77815a77cb - ãã䜿ãããå
¥åæ€èšŒããŸãšããŠã¿ã - ãã°ããéèš
http://blog.shibayan.jp/entry/20110708/1310132392
- ASP.NET MVCã®ã¢ãã«ã§ãã䜿ã屿§ïŒã¢ãããŒã·ã§ã³ïŒãªã¹ã - Qiita
è£è¶³ïŒ
StringLengthãšMaxLengthã®éãïŒ: 衚㮠3ã»4 ã¯
æŠèŠãåãã«èŠããããçšéãéãã
屿§ äž»ãªçšé StringLengthå ¥åæ€èšŒïŒæå°é·ãæå®ã§ããïŒ MaxLengthDB ã¹ããŒãã®çæïŒEF ã®ã«ã©ã é·ïŒïŒæ€èšŒ [StringLength(50, MinimumLength = 3)] // æ€èšŒçš [MaxLength(50)] // EF ã nvarchar(50) ãäœã public string Name { get; set; }EF Core ã§ã¯
MaxLengthãåé·ã«åæ ãããããã
äž¡æ¹ä»ããããMaxLength+Requiredã§æžãŸããããšãå€ãã
RegularExpressionã䜿ãå Žå㯠ReDoS ã«æ³šæãã
ïŒæ£èŠè¡šçŸ ã®è©²åœç¯ãåç §ïŒã
ãŠãŒã¶ãŒå ¥åã察象ã«ãããããå ¥ãåã®éæå®åãé¿ããã
DataType 屿§ãæ€èšŒå±æ§ãšããŠæ©èœããã
-
åè
- DataType 屿§ã«ããæ€èšŒ
http://surferonwww.info/BlogEngine/post/2016/03/08/validation-by-datatypeattribute-and-default-error-message.aspx
- DataType 屿§ã«ããæ€èšŒ
ãã£ããã以äžã®ããã«ããŠãCustomValidation 屿§ã䜿çšããã
-
åé ç®ãã§ãã¯åŠç
- ããããã£ã« CustomValidation 屿§ãèšå®ããåŒã³åºãæ€èšŒã¡ãœãããšé¢é£ä»ããã
- CustomValidation 屿§ã«èšå®ãããstatic ã®æ€èšŒã¡ãœãããå®çŸ©ããã
- æ€èšŒã¡ãœããã§ã¯ãæ€èšŒçµæãšããŠãValidationResult ãè¿ãã
-
é¢é£ãã§ãã¯åŠç
- ã¢ãã«ã« CustomValidation 屿§ãèšå®ããåŒã³åºãæ€èšŒã¡ãœãããšé¢é£ä»ããã
- CustomValidation 屿§ã«èšå®ãããstatic ã®æ€èšŒã¡ãœãããå®çŸ©ããã
- æ€èšŒã¡ãœããã§ã¯ãæ€èšŒçµæãšããŠãValidationResult ãè¿ãã
ãã£ããã以äžã®ããã«ããŠãèªäœ Validation 屿§ãå®çŸ©ããŠäœ¿çšããã
-
åé ç®ãã§ãã¯åŠç
- ããããã£ã«èªäœ Validation 屿§ãæå®ããŠæ€èšŒãã©ã¡ã¿ããšã©ãŒã¡ãã»ãŒãžãæå®ããã
-
èªäœ Validation 屿§ã®äœæ
-
ValidationAttribute ã¯ã©ã¹ãç¶æ¿ããèªäœ Validation ãå®çŸ©ããã
-
ã³ã³ã¹ãã©ã¯ã¿ãå®è£
æ€èšŒãã©ã¡ã¿ãšãšã©ãŒã¡ãã»ãŒãžãæºåïŒå¿ èŠã«å¿ããŠãã©ã¡ã¿ã©ã€ãºïŒ -
ã¡ãœããã override ããŠå®è£ ããã
- FormatErrorMessage ã¡ãœããã§ãšã©ãŒã¡ãã»ãŒãžãçæ
- IsValid ã¡ãœããã§æ€èšŒåŠçãå®è£ ããæ€èšŒçµæãšããŠãbool ãè¿ãã
-
-
èªäœ Validation 屿§ãã¯ã©ã€ã¢ã³ãåŽæ€èšŒã«å¯Ÿå¿ãããã
-
IClientValidatable ã€ã³ã¿ãŒãã§ã€ã¹ãå®è£ ããã
- 屿§ãš View ã®æ©æž¡ããè¡ãªã GetClientValidationRules ã¡ãœãããå®è£ ããã
- GetClientValidationRules ã¡ãœããã§ã¯ã
IEnumerable<ModelClientValidationRule> ãè¿ãã - ããã«ãããæ€èšŒåã«å¯Ÿå¿ããæ€èšŒãã©ã¡ã¿ãšãšã©ãŒã¡ãã»ãŒãžã
HTML åŽã«å±æ§ãšããŠåºåãããã
-
ModelClientValidationRule ã®ããããã£
https://learn.microsoft.com/en-us/dotnet/api/system.web.mvc.modelclientvalidationrule- ValidationTypeïŒæ€èšŒåïŒ
- ValidationParametersïŒæ€èšŒãã©ã¡ã¿ã® Key/ValueïŒ
- ErrorMessageïŒãšã©ãŒã¡ãã»ãŒãžïŒ
-
jQuery Validation ãã©ã°ã€ã³ãšã®é¢é£ä»ãã
æ€èšŒããžãã¯ãç¬èª js ãã¡ã€ã«ã«å®çŸ©ããã$.validator.addMethod('æ€èšŒå', ïœ$.validator.unobtrusive.adapters.addSingleVal('æ€èšŒå', 'æ€èšŒãã©ã¡ã¿ã®Key');- BundleConfig.cs ã«ããã®ç¬èª js ãã¡ã€ã«ã jqueryval ã« include ãã
ãã³ãã«å®çŸ©ã远å ããã
-
ç§»è¡ã¡ã¢ïŒè¡šèšïŒ: åæã®ãIClientValidation ã€ã³ã¿ãŒãã§ã€ã¹ã
ãGetClientValidationRule ã¡ãœãããã¯ã
å®éã®ååã»ã¡ãœããåã«åãããŠ
IClientValidatable/GetClientValidationRulesã«ä¿®æ£ããã
ãŸã$.Validator.addMethodã¯$.validatorïŒå°æåïŒãæ£ããã
è£è¶³ïŒASP.NET Core ã§ã®èªäœæ€èšŒïŒ: ä»çµã¿ã¯å€§ããå€ãã£ãŠããã
ASP.NET MVC 5 ASP.NET Core ãµãŒãåŽ ValidationAttributeãç¶æ¿åã ã¯ã©ã€ã¢ã³ãåŽ IClientValidatableIClientModelValidator屿§ã®åºå ModelClientValidationRulecontext.Attributes.Add(...)public class MyAttribute : ValidationAttribute, IClientModelValidator { public void AddValidation(ClientModelValidationContext context) { context.Attributes["data-val"] = "true"; context.Attributes["data-val-my"] = FormatErrorMessage(...); } }ããçŸä»£çãªä»£æ¿ãšã㊠FluentValidation ãããã
屿§ã§ã¯ãªãå°çšã¯ã©ã¹ã«æ€èšŒã«ãŒã«ãæžãæ¹åŒã§ã
- æ€èšŒããžãã¯ãã¢ãã«ããåé¢ããã
- æ¡ä»¶ä»ãæ€èšŒã»è€éãªã«ãŒã«ãæžãããã
- åäœãã¹ããããã
ãšããå©ç¹ããããå®åã§ã®æ¡çšäŸãå€ãã
ãã£ããã以äžã®ããã«ããŠãIValidatableObject ã䜿çšããã
è€æ°ã®æ€èšŒçµæãè¿ããã®ã¯ãIValidatableObject ã ãã§ããã
- é¢é£ãã§ãã¯åŠçïŒIValidatableObjectïŒ
- ã¢ãã«ã§ IValidatableObject ãå®è£ ã㊠IValidatableObject.Validate ã¡ãœãããå®è£ ããã
- æ€èšŒã¡ãœããã§ã¯ãæ€èšŒçµæãšããŠãIEnumerable<ValidationResult> ãè¿ãã
è£è¶³ïŒå®è¡é åºã«æ³šæïŒ:
IValidatableObject.Validateã¯
屿§ã«ããæ€èšŒããã¹ãŠæåããåŸã«ã®ã¿åŒã°ãããâ åããããã£ã®æ€èšŒå±æ§ïŒRequiredãStringLength âŠïŒ â 1 ã€ã§ã倱æããã â¡ ã¯åŒã°ããªã â¡ IValidatableObject.ValidateïŒé ç®éã®é¢é£ãã§ãã¯ïŒãã®ããã**ãå¿ é é ç®ã空ã®ãšããé¢é£ãã§ãã¯ãèµ°ããªãã**ã®ã¯
仿§éãã§ããïŒããã null åç §ãé¿ããããŠéœåãè¯ãïŒã
Action Method ã®å®è¡åã«ãã¢ãã«ã»ãã€ã³ãã£ã³ã°ã
è¡ãããã¿ã€ãã³ã°ã
-
æŠèŠ
- Controller.ModelState ã§ã¢ã¯ã»ã¹ã§ããã
- ã¢ãã«ã®ç¶æ ãšã¢ãã«ã»ãã€ã³ãã£ã³ã°ã®æ€èšŒçµæãå«ãã
-
Property
- IsValid ããããã£
ã¢ãã«ã»ãã€ã³ãã£ã³ã°ã®æ€èšŒçµæãšããŠãã¢ãã«ã®æå¹ã»ç¡å¹ãè¿ãã - Keys ããããã£
- Values ããããã£
- IsValid ããããã£
-
Method
- ModelState.AddModelError()
ãšã©ãŒæ å ±ã远å ããã
- ModelState.AddModelError()
è£è¶³ïŒ
IsValidã®ç¢ºèªã¯å¿ é ïŒ: æ€èšŒã¯èªåã§å®è¡ããããã
çµæã®ç¢ºèªã¯èªåã§ã¯ãªãã[HttpPost] public ActionResult Create(OrderVm vm) { if (!ModelState.IsValid) // â ãããæžãå¿ãããšæ€èšŒãç¡æå³ return View(vm); ... }ASP.NET Core ã®
[ApiController]ãä»ããå Žåã¯èªååããã
ïŒæ€èšŒå€±ææã«èªåã§ 400 +ValidationProblemDetailsãè¿ãïŒã[ApiController] // â ããã§ ModelState.IsValid ã®ç¢ºèªãäžèŠã«ãªã [Route("api/[controller]")] public class OrdersController : ControllerBase { }MVCïŒç»é¢ããïŒã§ã¯èªååãããªãããã
æç€ºçãªç¢ºèªãåŒãç¶ãå¿ èŠã§ããã
- Method
- Html.ValidationSummary
ãã¹ãŠã®æ€èšŒçµæã®ãšã©ãŒ ã¡ãã»ãŒãžãèŠçŽããã - Html.ValidationMessage
åã ã®æ€èšŒçµæã®ãšã©ãŒ ã¡ãã»ãŒãžã衚瀺ããã - Html.ValidationMessageFor
åã ã®æ€èšŒçµæã®ãšã©ãŒ ã¡ãã»ãŒãžã衚瀺ããã
- Html.ValidationSummary
-
æ€èšŒåŸã«é©çšããã CSS ã¯ã©ã¹
ãããã® CSS ã¯ã©ã¹ã Site.css ãã¡ã€ã«ã«å®çŸ©ããŠããã- validation-summary-errors
ValidationSummary ã¡ãœããã«ãã£ãŠåºåãããã¡ãã»ãŒãžã®<div>èŠçŽ ïŒãšã©ãŒæïŒ - validation-summary-valid
ValidationSummary ã¡ãœããã«ãã£ãŠåºåãããã¡ãã»ãŒãžã®<div>èŠçŽ ïŒãšã©ãŒç¡ïŒ - field-validation-error
ValidationMessage ã¡ãœããã«ãã£ãŠåºåãããã¡ãã»ãŒãžã®<span>èŠçŽ ïŒãšã©ãŒæïŒ - field-validation-valid
ValidationMessage ã¡ãœããã«ãã£ãŠåºåãããã¡ãã»ãŒãžã®<span>èŠçŽ ïŒãšã©ãŒç¡ïŒ - input-validation-error
æ€èšŒãšã©ãŒãçºçããèŠçŽ
- validation-summary-errors
-
JavaScript ã§ã®ã¯ã©ã€ã¢ã³ãåŽæ€èšŒ
- jQuery Validation ãã©ã°ã€ã³ãªã©ã䜿çšå¯èœã
- Controller 远å ã§ãã¹ãã£ãã©ãŒã«ãã£ã³ã°ããéã
ã¹ã¯ãªããã©ã€ãã©ãªã®åç §ã«ãã§ãã¯ãå ¥ãããš JavaScript ã©ã€ãã©ãªã
ã€ã³ããŒãã§ããã
è£è¶³ïŒã¯ã©ã€ã¢ã³ãåŽæ€èšŒã¯ãè£å©ãã§ããïŒ: åæãšããŠã
ã¯ã©ã€ã¢ã³ãåŽæ€èšŒã¯ãµãŒãåŽæ€èšŒã®ä»£ããã«ãªããªããã¯ã©ã€ã¢ã³ãåŽæ€èšŒ ⊠UX ã®åäžïŒåŸåŸ©ãæžããïŒ â éçºè ããŒã«ã§ç¡å¹åã§ãã ãµãŒãåŽæ€èšŒ ⊠ã»ãã¥ãªãã£ã»æŽåæ§ã®æ ä¿ â å¿ ã宿œãã
ModelState.IsValidãçç¥ããŠã¯ãªããªãçç±ãããã«ãããASP.NET Core ã§ã®ã¿ã° ãã«ããŒç:
<div asp-validation-summary="ModelOnly"></div> <input asp-for="Name" /> <span asp-validation-for="Name"></span>CSS ã¯ã©ã¹åïŒ
field-validation-errorçïŒã¯åãã§ããã
CustomValidation 屿§ã§ã¯ã¯ã©ã€ã¢ã³ãåŽæ€èšŒãå®è¡ãããªãã
æŽåæ§ããšãããã«ãã¯ã©ã€ã¢ã³ãåŽæ€èšŒã®ç¡å¹åãè¡ãªãã
<add key="ClientValidationEnabled" value="false" />è¥ããã¯ãèªäœ Validation 屿§ã«ã¯ã©ã€ã¢ã³ãåŽæ€èšŒãå®è£ ããã
ã¯ã©ã€ã¢ã³ãåŽæ€èšŒã«ãæ§ãã㪠JavaScriptãã®ãã©ãã€ã ãå°å ¥ãããŠããã
- *.html ãã¡ã€ã«åŽã« JavaScript ã§ã¯ãªãã屿§ãæžãã
- JavaScript 㯠*.js ãã¡ã€ã«åŽã«æžããŠãHTML ãš JavaScript ãåé¢ããã
- ãæ§ãã㪠JavaScriptãã¯ä»¥äžã®ãã©ã¡ã¿ã§å¶åŸ¡ã§ããã
<add key="UnobtrusiveJavaScriptEnabled" value="true"/>- æ§ãããªJavaScript - Wikipedia
https://ja.wikipedia.org/wiki/%E6%8E%A7%E3%81%88%E3%82%81%E3%81%AAJavaScript
è£è¶³ïŒãæ§ãã㪠JavaScriptãã®å®äœïŒ: HTML åŽã«
data-val-*屿§ãåºåããJavaScript ããããèªãã§æ€èšŒããæ¹åŒã§ããã<input name="Age" type="text" data-val="true" data-val-required="幎霢ã¯å¿ é ã§ãã" data-val-range="0ã150 ã§å ¥åããŠãã ããã" data-val-range-min="0" data-val-range-max="150" />HTML ãš JavaScript ãåé¢ãããããã
- ãµãŒãåŽã®å±æ§ããèªåçæã§ããïŒäºé管çãé¿ããããïŒ
- JavaScript ãå·®ãæ¿ããŠã HTML ã¯å€ãããªã
ãšããå©ç¹ãããã
ASP.NET Core ã§ããã®æ¹åŒããã®ãŸãŸäœ¿ãããŠãã
ïŒjquery.validate.unobtrusive.jsïŒããªããjQuery äŸåãå€ãããå Žåã¯ã
aspnet-client-validationçã®ä»£æ¿ã©ã€ãã©ãªãããã
-
æ¹æ³: DataAnnotations 屿§ã䜿çšããŠã¢ãã« ããŒã¿ãæ€èšŒãã
https://learn.microsoft.com/ja-jp/previous-versions/aspnet/ee256141(v=vs.100) -
ãæ¥œãã¿ã¯ããããã ïŒ
- ASP.NET MVC RCã®å
¥åæ€èšŒ
http://takepara.blogspot.jp/2009/02/aspnet-mvc-rc.html - DataAnnotationsã ãã§ã®å
¥åæ€èšŒã®ç²ç¹
http://takepara.blogspot.jp/2009/02/dataannotations.html
- ASP.NET MVC RCã®å
¥åæ€èšŒ
-
Entity Frameworkãšæ€èšŒåŠçã
- ASP.NET MVC 3ã«ãããæ€èšŒãŸããã®æ¹åç¹ ïŒ3-4ïŒïŒCodeZine
http://codezine.jp/article/detail/6176?p=3 - ASP.NET MVC 4 ããšã¯ããïŒïŒïŒã¢ãã«ãšè¶³å Ž - ã¢ãŒããã¯ãã£ãã¹ããŒãã«ã
http://d.hatena.ne.jp/architect-wat/20130512/1368360044
- ASP.NET MVC 3ã«ãããæ€èšŒãŸããã®æ¹åç¹ ïŒ3-4ïŒïŒCodeZine
ã¹ãã£ãã©ãŒã«ãã£ã³ã°ïŒScaffoldingïŒã
æ¥æ¬èªã§ãè¶³å Žããã骚çµã¿ãã®æå³ã
- MïŒModelïŒãå
ã«ã
- CïŒControllerïŒ
- CRUD ãè¡ã Action Method
- VïŒViewïŒ
- CïŒControllerïŒ
ãèªåã§çæããæ©èœã
-
éåžžã
- CRUD ã® Action Method ã ããèªåçæãããã
-
Entity Frameworkã«ããããŒã¿æäœãè¡ãå Žåã
Action Method ã«å ã㊠View ãèªåçæã§ããã
-
ãã®ä»
- 䜿çšãã Model ãéžæããã
- Model ã®æ°èŠäœæãå¯èœ
-
MïŒModelïŒã®è€æ°åœ¢ + Controller ãšããåç§°ã«ãªãã
-
Action Method
- Index
- Details
- Create
- Edit
- Delete
- Entity Frameworkã䜿çšãããšã以äžã®ããã« View ãŸã§èªåçæãããã
- ãŸããEntity Frameworkã䜿çšããªãå Žåããåå¥ã«ã
ModelMetadata ãå®çŸ©ãã Model ãæå®ã View 远å ïŒã¹ãã£ãã©ãŒã«ãã£ã³ã°ïŒãã§ããã
| é çª | View å | 察å¿ãã Action Method å | 䜿çšããã Template å |
|---|---|---|---|
| 1 | Index.cshtml | Index | List |
| 2 | Details.cshtml | Details | Details |
| 3 | Create.cshtml | Create | Create |
| 4 | Edit.cshtml | Edit | Edit |
| 5 | Delete.cshtml | Delete | Delete |
- ASP.NET MVC - æ¢å®ã®ã¹ãã£ãã©ãŒã«ãã£ã³ã° ãã³ãã¬ãŒãããªãŒããŒã©ã€ããã
https://learn.microsoft.com/ja-jp/archive/msdn-magazine/2014/june/asp-net-mvc-overriding-the-default-scaffolding-templates
è£è¶³ïŒã¹ãã£ãã©ãŒã«ãã£ã³ã°ã¯ãå©ãå°ãïŒ: çæãããã³ãŒãã
ãã®ãŸãŸæ¬çªã«äœ¿ããªãã®ãå®åäžã®åæã§ãããçæãããã³ãŒãã®åé¡ç¹ ã»ãšã³ãã£ãã£ãçŽæ¥ãã€ã³ãããŠããïŒãªãŒããŒãã¹ãã£ã³ã°ïŒ ã»åæã¡ãœããïŒasync ã§ãªãïŒâ» çŸåšã®çæã¯ async ã»DbContext ã Controller ããçŽæ¥äœ¿ã£ãŠãã ã»ãšã©ãŒåŠçã»ãã°ãç¡ã ã»ããŒãžã³ã°ãç¡ãïŒå šä»¶ååŸïŒ**ãåãé圢ãçŽ æ©ãåŸãŠãããããäœãæ¿ããã**ãšãã
äœ¿ãæ¹ãé©åã§ããã
åæãæŠèŠã§ãè¥å€§ããããåŸåãããããšèŠåããŠããã®ã¯ã
çæããããã®ããã®ãŸãŸè²ãŠãŠããŸãå±éºãæããŠãããASP.NET Core ã§ã®çæ:
dotnet tool install -g dotnet-aspnet-codegenerator dotnet aspnet-codegenerator controller -name OrdersController \ -m Order -dc AppDbContext --relativeFolderPath Controllers \ --useDefaultLayout --referenceScriptLibraries
- Html ãã«ããŒã䜿çšãããšãèªåçã«ãµãã¿ã€ãžã³ã°ãè¡ãããã
- Model ã®ããããã£ãçŽæ¥ View ã«è¡šç€ºããå Žåã¯ãèªåã§ã®ãµãã¿ã€ãžã³ã°ãå¿ èŠã
ç§»è¡ã¡ã¢ïŒè£è¶³ïŒ: Razor ã§ã¯
@ã«ããåºåãèªåãšã¹ã±ãŒãããã
ïŒASP.NET MVCã®çšèª ã® Razor ç³»ã®ç¯ãåç §ïŒã
åæã®ãèªåã§ã®ãµãã¿ã€ãžã³ã°ãå¿ èŠãã¯ã
@Html.Raw()ã䜿ãå Žåã«éã£ã話ãšèªãã®ã劥åœã§ããã
- requestValidationMode ã MVC ã§ãå©çšå¯èœã
http://stackoverflow.com/questions/6206540/what-does-requestvalidationmode-2-0-actually-do
è£è¶³ïŒãªã¯ãšã¹ãæ€èšŒã¯è£å©çãªæ©æ§ïŒ:
requestValidationã¯
<ãå«ãå ¥åãªã©ãäžåŸã§æåŠããä»çµã¿ã§ã
ãA potentially dangerous Request.Form value was detectedããšãã
äŸå€ã®æ£äœã§ããã// ç¹å®ã®ããããã£ã ãèš±å¯ãã [AllowHtml] public string Body { get; set; } // ã¢ã¯ã·ã§ã³å šäœã§ç¡å¹åããïŒéæšå¥šïŒ [ValidateInput(false)]ãã㯠XSS 察çã®æ¬äœã§ã¯ãªãïŒåºåæã®ãšã¹ã±ãŒããæ¬äœïŒã
ãªãã ããã¹ãå ¥åãªã©ã§ç¡å¹åããå Žåã¯ã
HtmlSanitizer çã§æç€ºçã«ãµãã¿ã€ãºããããšãASP.NET Core ã«ã¯ãªã¯ãšã¹ãæ€èšŒæ©æ§ãç¡ã
ïŒãåºåæã«å¿ ããšã¹ã±ãŒããããèšèšã«äžæ¬åãããïŒã
ASP.NET MVCã®ãã³ãã¬ãŒãã§ã¯ã
- ASP.NET Identityã䜿çšãããã
- åŸæ¥ã®ãåºæ¬çãªãASP.NET Forms èªèšŒã䜿çšå¯èœã
- ASP.NET MVC ã§ ãã©ãŒã èªèšŒ ã®å®è£
æ¹æ³
https://garafu.blogspot.jp/2013/11/aspnet-mvc.html
-
ASP.NET Forms èªèšŒããé«åºŠãªèªèšŒåºç€ã
-
ãŸããASP.NET Identityã䜿çšãããšã
OAuthã®ã¯ã©ã€ã¢ã³ã & ãµãŒãæ©èœãå®è£ ã§ããã-
OAuthã®ã¯ã©ã€ã¢ã³ã : ASP.NET Identityã®å€éšãã°ã€ã³
-
OAuthã®ãµãŒã : ASP.NET Identityã®OAuth2ã«ããSTSå®è£
-
Tags: ç§»è¡, .NETéçº, ASP.NET, ASP.NET MVC