Asp.Net MVCã®ã»ãšãã©ã®çŽ¹ä»ã§ã¯ãããã¹ãããã§ãã¯ããã¯ã¹ãªã©ã®åçŽãªå
¥åãã£ãŒã«ããžã®ã¢ãã«ã®ãã€ã³ããçŸããç°¡åã«æŽçããæ¹æ³ã«ã€ããŠèª¬æããŠããŸãã ããªãã倧èäžæµãªã³ãŒããŒããã®æ®µéããã¹ã¿ãŒããããããããŠã³ãªã¹ãããã§ãã¯ããã¯ã¹ãŸãã¯ã©ãžãªãã¿ã³ãªã¹ãã衚瀺ããæ¹æ³ãèŠã€ãããå Žåã
ãã®æçš¿ã¯ããªãã®ããã§ãã
åé¡ã®å£°æ
ç§ãã¡ã¯ååãšãžã£ã³ã«ãç¥ã£ãŠããæ ç»ã®ããŒã¿ããŒã¹ãæã£ãŠããŸãã ãªã¹ããããžã£ã³ã«ãéžæãããŠããæ ç»ã«é¢ããæ
å ±ã®ãšãã£ã¿ãŒã衚瀺ããããšæããŸãã åé¡ã¯ããã¥ãŒãæ ç»èªäœãšãžã£ã³ã«ã®ãªã¹ãã®äž¡æ¹ã«é¢é£ããããŒã¿ãæã£ãŠããå¿
èŠãããããšã§ãã ããã«ãæ ç»ã«é¢ããããŒã¿ã¯ç§ãã¡ãèŠãã
ãã®ãæãããžã£ã³ã«ã®ãªã¹ãã¯æ
å ±ã
ç·šéãã
æ¹æ³ãæããŸãã
æåã®æ¹æ³ã ãã
ã³ã³ãããŒã©ãŒãä»ããŠãã£ã«ã ã«é¢ããããŒã¿ã転éããããšãã§ãããã¥ãŒã¯ããèªäœã§ãžã£ã³ã«ã®ãªã¹ããæœåºããŸãã ãããèãããããã¹ãŠã®ååã®éåã§ããããšã¯æããã§ãããçè«çã«ã¯ãã®ãããªå¯èœæ§ããããŸãã
ãã®ãããªã¢ãã«ã®ã¯ã©ã¹ããããŸãã
public class MovieModel { public string Title { get; set; } public int GenreId { get; set; } } public class GenreModel { public int Id { get; set; } public string Name { get; set; } }
åå¿è
åãã¬ã€ãã®ãããªã³ã³ãããŒã©ãŒã¡ãœããïŒ
public ActionResult TheUgly(){ var model = Data.GetMovie(); return View(model); }
ããã§ãDataã¯ããŒã¿ãæäŸããåãªãéçã¯ã©ã¹ã§ãã ããã¯è°è«ãç°¡åã«ããããã ãã«èæ¡ããããã®ã§ãããå®éã«ãã®ãããªãã®ã䜿çšããããšã¯ãå§ãããŸããã
public static class Data { public static MovieModel GetMovie() { return new MovieModel {Title = "Santa Barbara", GenreId = 1}; } }
ããã§ãã²ã©ããã¥ãŒããŸãã¯ãããããžã£ã³ã«ã®ãªã¹ãã«é¢ä¿ãããã®éšåãæäŸããŸãã åºæ¬çã«ãã³ãŒãã¯ãã¹ãŠã®ãžã£ã³ã«ãåŒãåºããŠãSelectListItemåã®èŠçŽ ã«å€æããå¿
èŠããããŸãã
<% var selectList = from genre in Data.GetGenres() select new SelectListItem {Text = genre.Name, Value = genre.Id.ToString()}; %> <%:Html.DropDownListFor(model => model.GenreId, selectList, "choose") %>
ããã§äœãã²ã©ãã§ããïŒ ç§ã®æèŠã§ã¯ãAsp.Net MVCã®äž»ãªå©ç¹ã¯ãæ確ãªè·ååé¢ïŒSoCïŒãããããšã§ãã ç¹ã«ããã¥ãŒã§ããŒã¿ãéä¿¡ããã®ã¯ã³ã³ãããŒã©ãŒã§ãã ãã¡ãããããã¯æ矩ã§ã¯ãªããåãªãè¯ãã«ãŒã«ã§ãã ããã«éåãããšãæåºç©ã«äžèŠãªã³ãŒãã®æãã²ããã1幎ã§éåžžã«é£ããããšãæŽçãããªã¹ã¯ããããŸãã
ãã©ã¹ ïŒã·ã³ãã«ãªã³ã³ãããŒã©ãŒã
ãã€ãã¹ ïŒã³ã³ãããŒã©ãŒã«åºæã®ã³ãŒãããã¥ãŒã«å
¥ããŸãã MVCã¢ãã«ã®ååã«å¯Ÿããé倧ãªéåã
䜿çšããå Žå ïŒãã¢ããã°ããã¹ã±ããããå¿
èŠãããå Žåã
2çªç®ã®æ¹æ³ã æªãã
åãšåæ§ã«ãã³ã³ãããŒã©ãŒãä»ããŠæšæºçãªæ¹æ³ã§ã¢ãã«ã転éããŸãã ViewDataãä»ããŠãã¹ãŠã®è¿œå ããŒã¿ãéä¿¡ããŸãã ããã«ã³ã³ãããŒã©ãŒã¡ãœããããããŸãïŒ
public ActionResult TheBad() { var model = Data.GetMovie(); ViewData["AllGenres"] = from genre in Data.GetGenres() select new SelectListItem {Text = genre.Name, Value = genre.Id.ToString()}; return View(model); }
äžè¬çãªã±ãŒã¹ã§ã¯ãViewDataã«äœã§ãç©ã¿äžããããšãã§ããããšã¯æããã§ãã ããã«ãViewã§ãã®ãã¹ãŠã®ããžãã¹ã䜿çšããŸãã
<%:Html.DropDownListFor(model => model.GenreId, (IEnumerable<SelectListItem>) ViewData["AllGenres"], "choose")%>
ããã« ããwhatããšãhowãã®ããŒã¿ã¯æ確ã«åé¢ãããŠããŸããæåã®ããŒã¿ã¯ã¢ãã«ã«æ ŒçŽããã2çªç®ã®ããŒã¿ã¯ViewDataã«æ ŒçŽãããŸãã
çæ ïŒããŒã¿ã¯åé¢ãããŸãããã³ã³ãããŒã©ãŒã¡ãœããã¯ããªãŒããŒããŒãããããŸãã2ã€ã®ïŒãããŠå°æ¥-å€ãã®ïŒãã®ãäžåºŠã«åŠçããŸãã ããã«ãäœããã®çç±ã§ãåé¡ã解決ãããããã«ãŒãæ段ãšããŠã®ViewDataã«å¯Ÿããæ¬èœçãªæ
床ããããŸãã åçèšèªã®æ¯æè
ã¯ãViewDataãåãã§æ¥œãããããããŸãããã
䜿çšããå Žå ïŒ1ã€ãŸãã¯2ã€ã®ãªã¹ããæã€å°ããªåœ¢åŒã
第äžã®æ¹æ³ã è¯ãã
å¿
èŠãªãã¹ãŠã®ããŒã¿ãå«ãã¢ãã«ã䜿çšããŸãã æ¬ã®ããã«ã
public class ViewModel { public MovieModel Movie { get; set; } public IEnumerable<SelectListItem> Genres { get; set; } }
ã³ã³ãããŒã©ãŒã®ã¿ã¹ã¯ã¯ãå©çšå¯èœãªããŒã¿ãããã®ã¢ãã«ãäœæããããšã§ãã
public ActionResult TheGood() { var model = new ViewModel(); model.Movie = Data.GetMovie(); model.Genres = from genre in Data.GetGenres() select new SelectListItem {Text = genre.Name, Value = genre.Id.ToString()}; return View(model); }
ãã©ã¹ ïŒMVCãã¿ãŒã³ã®æšæºçãªå®è£
ïŒããã¯è¯ãããã§ã¯ãªããä»ã®éçºè
ããããã¯ã«åå ããããããã§ãïŒã
çæ ïŒåã®äŸã®ããã«ãã³ã³ãããŒã©ãŒã¡ãœããã¯ãªãŒããŒããŒããããŠããŸãããäœããšãæ¹æ³ããå¿é
ã§ãã ãŸããåãViewModelã¯ã©ã¹ã§åããwhatããšãhowããæ¥ç¶ãããŠããŸãã
䜿çšããå Žå ïŒ1ã3åã®ãªã¹ããšä»ã®éæšæºå
¥åèŠçŽ ãæã€äžå°èŠæš¡ã®ãã©ãŒã ã§ã
4çªç®ã®æ¹æ³ã ããªãããŒã
ãã¥ãŒã«ããŒã¿ãé
ä¿¡ã§ããå¥ã®ãããã¯ãã¢ãããããŸããããã¯RenderActionã¡ãœããã§ãã å€å
žã«ããã°ãViewã¯ã³ã³ãããŒã©ãŒã«ã€ããŠç¥ããªãã¯ããªã®ã§ãå€ãã®äººããã®ã¡ãœããã«ã€ããŠäžæ©å«ã«ç¬ã£ãŠããŸãã ç§ã«ãšã£ãŠå人çã«ã¯ãããïŒç¥ã
ã¯ç§ãèš±ããŠãããŸãïŒã¯WebFormsã®UserControlsã«ãã䌌ãŠããŸãã ã€ãŸããããŒãžã®æ®ãã®éšåããå®è³ªçã«ïŒãã®ã¡ãœããã®åŒã³åºããã©ã¡ãŒã¿ãŒãé€ããŠïŒç¬ç«ããèŠçŽ ãäœæããæ©èœã
ãããã£ãŠãMovieModelãã¢ãã«ãšããŠäœ¿çšããã³ã³ãããŒã©ãŒã¡ãœããã¯TheUglyãšåãã§ãã ããããæ°ããã³ã³ãããŒã©ãŒãšãããããããŠã³ãã¬ã³ããªã³ã°ããããã®ã¡ãœãããšããã®ããããããŠã³ãéšåçã«äœ¿çšããæ¹æ³ããããŸãã ãã®éšåçãªæè»æ§ãæ倧éã«é«ããŠãä»ã®å Žåã«äœ¿çšã§ããããã«ãDropdown.ascxãåŒã³åºããŠViews \ Sharedãã©ã«ããŒã«é
眮ããŸãã
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<SelectListItem>>" %> <% =Html.DropDownList(ViewData.ModelMetadata.PropertyName, Model, ViewData.ModelMetadata.NullDisplayText)%>
ãã®ãã¥ãŒãã¬ã³ããªã³ã°ããæ¹æ³ã«ã€ããŠã¯ãããã€ãã®ããªãã¯ããããŸãã
public class GenreController : Controller{ public ActionResult GetGenresDropdown(int selectedId) { ViewData.Model = from genre in Data.GetGenres() select new SelectListItem { Text = genre.Name, Value = genre.Id.ToString(), Selected = (genre.Id == selectedId) }; ViewData.ModelMetadata = new ModelMetadata( ModelMetadataProviders.Current, null, null, typeof (int), "GenreId") {NullDisplayText = "choose"}; return View("Dropdown"); } }
ãŸããããã§ç®çã®å€ã®èªåéžæã倱ããããããSelectListItemã®Selectedããããã£ãæåã§èšå®ããå¿
èŠããããŸãã 次ã«ãéèŠãªã¡ã¿ããŒã¿ããã¥ãŒã«è»¢éããå Žåãæåã«ã¢ãã«ãã€ã³ã¹ããŒã«ããŠãããã¡ã¿ããŒã¿ãã€ã³ã¹ããŒã«ããå¿
èŠããããŸãã ãã以å€ã®å Žåãã¢ãã«ã«åºã¥ããŠã¡ã¿ããŒã¿ãèªåçã«äœæãããŸãã åãçç±ã§ãæ»ãå€ã®ãã¥ãŒïŒã¢ãã«ïŒãæžãã¹ãã§ã¯ãããŸããã å®éãããããã£ã®ååãšããã©ã«ãã®ããã¹ãïŒNullDisplayTextïŒã決å®ããã«ã¯ãå®éã«ã¡ã¿ããŒã¿ãå¿
èŠã§ãã ã¡ãªã¿ã«ãåŸè
ã¯ãªããŠãã§ããŸãã
æåŸã«ãã³ã³ãããŒã©ãŒã¡ãœããã¯ã¡ã€ã³ãã¥ãŒããåŒã³åºãããŸãã
<% Html.RenderAction("GetGenresDropdown", "Genre", new {selectedId = Model.GenreId}); %>
é·æ ïŒã³ã³ãããŒã©ãŒã¬ãã«ã§ã®è²¬ä»»ã®åé¢ïŒMovieControllerã¯æ ç»ã®ããŒã¿ãGenreControllerã¯ãžã£ã³ã«ãæ
åœããŸãã ãã¥ãŒã¬ãã«ã§ã¯ãå®å
šãªåå©ãåŸãŠããŸããã¡ã€ã³ãã¥ãŒã倧å¹
ã«ç°¡çŽ åããããžã£ã³ã«ã®éžæã®å®è£
ã®è©³çŽ°ãè£å©ã«ãªããŸããã ã¡ãªã¿ã«ãé·ãã¡ãœããã®åçŽåãšãã«ããŒã¡ãœããã®ã³ãŒãã®äžéšã®åé€ã«ã¯ãããçšåºŠã®é¡äŒŒæ§ããããŸãã
çæ ïŒããå€ãã®ã³ãŒããããè€éãªæ§é ã
䜿çšããå Žå ïŒã¡ã€ã³ãã¥ãŒãååã«å€§ãããªããããããããŠã³ãè€æ°ã®ãã£ãŒã«ãã«è¡šç€ºãããå ŽåããŸãã¯ãžã£ã³ã«ã®éžæãè€æ°ã®ããŒãžã§äœ¿çšããå¿
èŠãããå Žåã
5çªç®ã®æ¹æ³ã ã¹ããŒãã
ç®çã®å€ã®å
¥åïŒãŸãã¯éžæïŒãæŽçããããšã®éèŠãªéšåå
šäœãã¡ã€ã³ãã¥ãŒããåé¢ãããŠããå Žåããã®ã¡ã€ã³ãã¥ãŒãäœããã®åœ¢ã§åçŽåããããšããèŠæããããŸãã ãããŠãããã§ã®æãããªè§£æ±ºçã¯ãHtml.EditorForModelïŒïŒã䜿çšããããšã§ãã çŸåšãã¢ãã«ã¯ã©ã¹ã®ã¡ã¿ããŒã¿ã¯ãç¹å®ã®ãã£ãŒã«ãã衚瀺ããããã®ã¡ãœãããéžæãã圹å²ãæãããŸãã å¯äžã®åé¡ã¯ãçµã¿èŸŒã¿ããŒã«ã䜿çšãããšãRenderActionïŒïŒã§ã¯ãªããé©åãªå Žæã§RenderPartialïŒïŒãåŒã³åºããããšã³ãžã³ã«åŒ·å¶ã§ããããšã§ãã ãã®ããã察å¿ããRenderActionãåŒã³åºã以å€ã«è² è·ããããªãéšåãã¥ãŒãäœæããå¿
èŠããããŸãã ïŒãã¡ããããã£ãŒã«ããšãã£ã¿ãŒãã«ã¹ã¿ãã€ãºããå¿
èŠãããå Žåã¯ããã®ç¹å®ã®ãã¥ãŒãå€æŽããDropDown.ascxããã¥ãŒãã©ã«ã®ãŸãŸã«ããŸããïŒ
ãããã£ãŠã\ Views \ Movie \ EditorTemplatesãã©ã«ããŒã§ãGenreEditor.ascxãšããéšåãã¥ãŒãäœæããŸãã ããã«ã¯ãç·šéäžã®ãžã£ã³ã«IDããããã£ãšåãã¿ã€ãã®ã¢ãã«ãã€ãŸãintããããŸãã ãã¥ãŒèªäœã«ã¯ãRenderActionã®åŒã³åºãã®ã¿ãå«ãŸããŸãã
<% Html.RenderAction("GetGenresDropdown", "Genre", new {selectedId = Model}); %>
ãã¥ãŒã䜿çšããã«ã¯ãå¿
èŠãªå±æ§ãã¢ãã«ã®ãžã£ã³ã«IDããããã£ã«è¿œå ããå¿
èŠããããŸãã
[UIHint("GenreEditor")]
é·æ ïŒåã®äŸãšåãã§ãããåæã«ã¡ã€ã³ãã¥ãŒã倧å¹
ã«ç°¡çŽ åããŸããã
çæ ïŒè¿œå ã®ãã¥ãŒãäœæããå¿
èŠããããŸããããïŒãããŸã§ã®ãšããïŒæå³ã®ããè² è·ã¯ããããŸããïŒãã ããããããããã³ããè¿œå ãããªã©ããã£ãŒã«ãã®ç·šéãã«ã¹ã¿ãã€ãºã§ããŸãïŒã ãã1ã€ã®éèŠãªãã€ãã¹ç¹ã¯ããã©ãŒã ã®äžè¬çãªæ§é ãã«ã¹ã¿ãã€ãºããã®ãé£ããããšã§ãïŒããšãã°ãå·ŠåŽã«1ã€ã®ãã£ãŒã«ãã衚瀺ããå³åŽã«æ®ãã®ãã£ãŒã«ãã衚瀺ãããªã©ïŒã ã°ããŒãã«ãªã«ã¹ã¿ãã€ãºãå¿
èŠãªå ŽåïŒããšãã°ãã©ãã§ãdivã®ä»£ããã«ããŒãã«ã䜿çšããå ŽåïŒãObjectçšã®ç¬èªã®ãã³ãã¬ãŒããäœæã§ããŸãã
䜿çšããå Žå ïŒå€ãã®ãã£ãŒã«ããããå Žåããããã¯å€ããå°ãªããæšæºçãªæ¹æ³ã§è¡šç€ºãããå€ãã®å Žåããã£ãŒã«ãã®ãªã¹ããå€æŽãããŸãã
ããã§ãã«ããŽãªãè©äŸ¡ãªã©ã®ããããããŠã³ãããå ŽåãïŒä»ã®ããããããŠã³ã®å Žåãšåæ§ã«ïŒDropdown.aspxã䜿çšã§ããŸãããGenreEditorãšåæ§ã®ã³ã³ãããŒã©ãŒã¡ãœãããšããŒã·ã£ã«ãèšè¿°ããå¿
èŠããããŸãã ãããæé©åããæ¹æ³ã¯ãããŸããïŒ æåã«ãåºæ¬çãªGeneric Controllerãäœæããããã«ã¡ãœãããéä¿¡ã§ããŸãã 次ã«ãé¢é£ä»ããããã¯ã©ã¹ã®ååïŒããžã£ã³ã«ãïŒãããŒã·ã£ã«ã«ïŒããšãã°ãDataTypeå±æ§ã䜿çšããŠïŒäœããã®æ¹æ³ã§è»¢éããããã«å¿ããŠRenderActionåŒã³åºããæ§ç¯ã§ããŸãã ããã§ãGenreEditorã®ä»£ããã«ãããããããŠã³ãªã¹ãããéžæããããã®ãŠãããŒãµã«ãšãã£ã¿ãŒãã§ããŸãã ãã®çµæãæ°ãããã£ã¬ã¯ããªãè¿œå ããŠããå¿
èŠãªã³ãŒãã®éãå¢å ããããšã¯ãããŸãããã¢ãã«ã®å±æ§ãé©å®è¿œå ããã ãã§ãã äŸã§ã¯ãããã¯ããã§ã¯ãããŸããããèªè
ã¯èªåã§ç°¡åã«å®è£
ã§ããŸãã
ä»ã«ã©ã®ããã«ã§ããŸããïŒ
é ã«æµ®ããã å¯äžã®æ¹æ³ã¯ãAJAXã䜿ã£ãŠããããããŠã³ãåããããšã§ãã ããã§ã®ãã©ã¹ã¯æããã§ããããŒã¿ã¯htmlããç¬ç«ããŠéä¿¡ãããä»ã®å Žæã§ç°ãªãæ¹æ³ã§äœ¿çšã§ããŸãã ãã®ãããªããšã¯Sparkã§éåžžã«ç°¡åã«å®è£
ã§ãããšèããŸããããç§ã®æã¯ãŸã è©ŠãããŠããŸããã
ãããŠããªããäžè¬çã«ãããã§èžæ°æµŽãããã®ã§ããïŒ
äŸã«ã¯åžžã«1ã€ã®åé¡ããããŸãã圌ãã¯ã圌ãã話ããŠããããšãæ確ã«ããã®ã«åååçŽã§ãªããã°ãªããŸãããããã®ãããªé£ãã決å®ãããçç±ã¯æ確ã§ã¯ãããŸããã ããã§ããã®åé¡ã«ã€ããŠæžå¿µãããå Žåã¯ãããã€äœ¿çšããããé
ç®ãå床ãèªã¿ãã ããã
ãã¡ããããããã®ãœãªã¥ãŒã·ã§ã³ã®ããããã䜿çšããåã«ãä¿¡å·å¯Ÿéé³æ¯ãæšå®ããããšããå§ãããŸããå°ããªãããžã§ã¯ãã¯ãã³ãŒããã¯ã©ã¹ããã¡ã€ã«ãªã©ãå°ãªããšãã«ç¶æããããã倧ããªãããžã§ã¯ãã¯æ±ããããã§ãèŠçŽ ã®æ°ãæãå€ãããããããæããã«å°ããªã¿ã¹ã¯ã®è§£æ±ºã«çŠç¹ãåãããŠããŸãã 幞ããªããšã«ããããã¯ãã¹ãŠååã«ãªãã¡ã¯ã¿ãªã³ã°ãããŠããŸããæåã®ãœãªã¥ãŒã·ã§ã³ã®1ã€ããå§ããŠããã©ãŒã ãããè€éã«ãªãã«ã€ããŠãããé«åºŠãªãªãã·ã§ã³ã«é²ã¿ãŸãã
ä»ã«äœïŒ ããã
ããã§ãœãŒã¹ãå
¥æã§ã
ãŸã ã ã楜ãã¿ãã ããïŒ