2011-01-09 8 views
1

フォームを送信した後に私自身のviewmodelを取得しようとしていますが、次のエラーが発生しました。 "'System.String []'型のオブジェクトを 'System'型にキャストできません。文字列 '」MVC - ListBoxForからViewModelオブジェクトを取得する

は、これは私のコードです:

VIEWMODE:

public class SoftwarePackages 
{ 
public string[] PermissionsList { get; set; } 
} 

のaspx

<%: Html.ListBoxFor(model => model.PermissionsList, new List<SelectListItem>(), new { size = 10 })%> 

コントローラ

[HttpPost] 
public ActionResult Index(SoftwarePackages softwarePackages) 
{ 
    code...code...code 
} 

問題は何ですか?さておき、あなたが示したコードを使用してモデルを取り戻すことはできませんのよう

はあなたに

zurdoIL

答えて

5

次は私のために正常に動作します:

モデル:

public class SoftwarePackages 
{ 
    public string[] PermissionsList { get; set; } 
    public IEnumerable<SelectListItem> Items { get; set; } 
} 

はコントローラー:

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new SoftwarePackages 
     { 
      Items = new SelectList(new[] 
      { 
       new SelectListItem { Value = "1", Text = "item 1" }, 
       new SelectListItem { Value = "2", Text = "item 2" }, 
       new SelectListItem { Value = "3", Text = "item 3" }, 
      }, "Value", "Text") 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(SoftwarePackages softwarePackages) 
    { 
     // do something with softwarePackages.PermissionsList 
     ... 
    } 
} 

ビュー:

<% using (Html.BeginForm()) { %> 
    <%: Html.ListBoxFor(model => model.PermissionsList, Model.Items, new { size = 10 })%> 
    <input type="submit" value="OK" /> 
<% } %> 
0

ありがとうございます。 ListBoxFor(およびDropDownListFor)ヘルパメソッドでは、IEnumerable<SelectListItem>を実際に使用して、SelectListItemsの空のコレクションをメソッドに渡しています。あなたはどのIEnumerable<string>からIEnumerable<SelectListItem>を作成するには、これらの拡張メソッドを使用することができます。

public static class IEnumerableStringExtensions 
{ 
    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items) 
    { 
     return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>()); 
    } 

    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, string selectedValue) 
    { 
     return IEnumerableStringExtensions.ToSelectListItemList(items, new List<string>()); 
    } 

    public static IEnumerable<SelectListItem> ToSelectListItemList(this IEnumerable<string> items, IEnumerable<string> selectedValues) 
    { 
     List<SelectListItem> listitems = new List<SelectListItem>(items.Count()); 

     foreach (string s in items) 
     { 
      listitems.Add(new SelectListItem() 
      { 
       Text = s, 
       Value = s, 
       Selected = selectedValues.Contains(s) 
      }); 
     } 

     return listitems; 
    } 
} 

このようなメソッドを使用します。

<%:Html.ListBoxFor(m => m.PermissionList, Model.PermissionList.ToSelectListItemList(), new { size = 10 })%> 

私は、コードからあなたをあなたの例外を複製することができませんでしたサンプルプロジェクトを使用して(​​はnullだった)が、少なくとも上記のクラスはあなたのモデルをサーバーに戻します(より正確には、ユーザーがリストから選択した値)。

1

私は問題を発見:

私のviewmodelで

は、私は次の属性を持っていた:

[Required(ErrorMessage = "Please provide a Description!")] 
[StringLength(255, ErrorMessage = "Description must be less than 255 characters!")] 
[DisplayName("Description")] 

と文字列にこのフィールドをキャストしようとした「StringLengthの」属性だった当然の

ありがとうございました!

ズールーイル

関連する問題