2011-01-03 2 views
1

나는 List<string> 속성을 가진 모델을 가지고 있습니다. 해당 속성에 바인딩하는 몇 가지 선택 목록을 제시하고자합니다.ASP.NET MVC에서 IList <string> 컬렉션에 여러 선택 목록을 바인딩 할 수 있습니까?

예를 들어, 내 모델의 이름이 Favoli라고 가정하고 사용자가 몇 가지 즐겨 찾는 색상을 선택하게했습니다.

public class Favorites 
{ 
    public List<string> FavoriteColors { get; set;} 
} 

인덱스를 사용하여 컬렉션에 바인딩을 시도했지만 FavoriteColors가 비어있어 문제가 발생했습니다.

@Html.DropDownListFor(m => m.FavoriteColors[0], ColorSelectList, "Select a color (required)") 
@Html.DropDownListFor(m => m.FavoriteColors[1], ColorSelectList, "Select a color (optional)") 
@Html.DropDownListFor(m => m.FavoriteColors[2], ColorSelectList, "Select a color (optional)") 

내가 이에게 몇 가지를 해결할 수있는 실현 : 여기에 작동하지 않는 코드 (널 제외)입니다.

  1. 빈 값으로 FavoriteColors를 채 웁니다. 그러나 내 모델에는 잘못된 코드 (빈 값)가있을 것이므로 코드에서 다른 장소의 여러 곳에서 해결해야 할 것이므로이 방법은 적절하지 않습니다.
  2. 내 모델을 변경하여 3 개의 문자열 속성 (예 : FavoriteColor1, FavoriteColor2, FavoriteColor3)을 갖도록하십시오. 바인딩은 더 쉬울 것이지만, 나는 여전히 많은 코드로 그 문제를 해결해야 할 것이다.

더 좋은 방법이 있습니까?

답변

0

MVC에서 목록을 처리하는 방식이 좋지 않기 때문에이 방법을 사용합니다.

foreach (var ColorArray in m.FavoriteColors) 
{ %> 

<select name='colors'> 
<% foreach (var color in ColorArray) 
{%> 

    <option><%= color.ToString() %></option> 

<% { %> 
</select> 
}%> 

원하는 인덱스 만 하드 코딩 할 수 있지만 일반적으로 생각하면됩니다. 또한이 방법을 사용하면 이러한 사례를 선택적으로 처리하려는 경우에도 null 확인을 수행 할 수 있습니다.

1

다음은 Razor 및 표준 DropDownListFor<T> 도우미를 사용하는 사용자에게 적합한 간단한 솔루션입니다.

모든 예제 데이터 및 사용자의 요구에 맞게 변경할 수 있습니다 파일을 기반으로 :

HomeController.cs

public class HomeController : Controller 
    { 
     public class FavoriteColorModel 
     { 
      public List<string> FavoriteColors { get; set; } 
     } 

     public ActionResult Index() 
     { 
      ViewBag.ColorList = new[] 
            { 
             "Blue", 
             "Red", 
             "Green", 
             "Orange" 
            }; 
      var favoriteColors = new FavoriteColorModel() 
            { 
             FavoriteColors = new List<string>() 
                   { 
                    "Color1", 
                    "Color2", 
                    "Color3" 
                   } 
            }; 
      return View(favoriteColors); 
     } 

     [HttpPost] 
     public ActionResult Save(FavoriteColorModel model) 
     { 
      TempData["SelectedColors"] = model.FavoriteColors; 
      return RedirectToAction("Index"); 
     } 
    } 

을 Index.cshtml

@model MvcApplication4.Controllers.HomeController.FavoriteColorModel 
@{ 
    ViewBag.Title = "Index"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>Index</h2> 

@if (TempData["SelectedColors"] != null) 
{ 
    <text> 
    You have selected the following colors:<br /> 
    <ul> 
    @foreach (var color in TempData["SelectedColors"] as List<string>) 
    { 
     <li style="color:@color">@color</li> 
    } 
    </ul> 
    </text> 
} 

@using (Html.BeginForm("Save", "Home")) 
{ 
    @: Favorite colors: 
    for (var index = 0; index < Model.FavoriteColors.Count; index++) 
    { 
     @Html.DropDownListFor(model => model.FavoriteColors[index], new SelectList(ViewBag.ColorList)) 
    } 
    <br /> 
    <input type="submit" value="Save" /> 
} 

당신의 선택한 색상이 제출시 목록 요소에 나타납니다. Color1, Color2 배열 등에 항목을 추가하여 저장할 색의 양을 제어 할 수 있습니다.

평화.

관련 문제