2012-03-13 14 views
2

Webアプリケーションに登録ビューがあります。ただし、アカウント登録が失敗し、ドロップダウンメニューが赤で表示されます。ここで無効なモデル状態を引き起こすドロップダウンメニュー。 ASP.NET MVC 3

はコードダウン私のドロップである:ここでは

<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownList("Companies", "<Select Company>") 
</div> 

は、ビューモデルの私の関連するコードです:私は、ビューを返す前に、ここで

[Display(Name = "Company")]  
public int? CompanyId { get; set; } 

public IEnumerable<SelectListItem> Companies { get; set; } 

は、コントローラの私の関連するコードです:

ViewBag.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName"); 

私がデバッグすると、ModelState.IsValidはfalseを返し、したがってtを返します彼は(私の場合はViewBag.Companiesを再設定して)表示します。

登録を成功させるにはどうすればよいですか?私はパラメータ内の各必須フィールドに記入します。会社を選択する必要はありません。 会社を選択しなかった場合、ModelState.IsValidはtrueを返し、コードを実行します。しかし、私はユーザーに、彼の会社に関連付けるオプションを持たせたいと思います。

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

+0

'ModelState'のエラーは何ですか?エラーは 'ModelState.Values'の' Errors'コレクションになければなりません。 – nemesv

+1

{System.InvalidOperationException: 'System.Web.Mvc.SelectListItem'型へのパラメータ 'System.String'から 'System.Web.Mvc.SelectListItem'へのパラメータ変換は、型変換器がこれらの型間で変換できないため失敗しました。 at System.Web.Mvc.ValueProviderResult.ConvertSimpleType(CultureInfoカルチャ、オブジェクト値、タイプdestinationType) –

+0

@nemesv ^^私は今これを調べています。 'public string CompanyId'の場合は –

答えて

3

ViewBag.Companiesを設定する必要があるのはなぜですか?モデルに選択リストを追加すると、より良いアプローチが得られます。醜いViewBag

を使用する必要あなたはこの

のViewModel

public class RegisterViewModel 
{ 
    [Display(Name = "Company")]  
    public int? CompanyId { get; set; } 

    public IEnumerable<SelectListItem> Companies { get; set; } 
} 

コントローラ

[HttpGet] 
public ActionResult Register() 
{ 
    RegisterViewModel viewModel = new RegisterViewModel(); 
    viewModel.Companies = new SelectList(db.Companies, "CompanyId", "CompanyName"); 

    return View(viewModel); 
} 

とビューで

<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CompanyId, Model.Companies, "<Select Company>") 
</div> 

この意志のようなものを持っているべきではありませんサーバー上のCompanyIdを正しくバインドします。

+0

この方法は私に 'InvalidOperationException'を与えます。 RegisterViewModel viewModel =新しいRegisterViewModel(); viewModel.Companies =新しいSelectList(db.Companies、 "CompanyId"、 "CompanyName"); 戻るビュー(viewModel); –

+0

私はこれまでにこの方法を試みましたが、同様の問題のためにこのように抑止されました。これを修正するための助けをいただければ幸いです。 –

+0

投稿したビュー部分を完全にコピーしてもよろしいですか?私はいつもこのパターンを使い、うまく動作します。 – archil

0

DropDownListは、ASP.Net MVC3で奇妙なものです。 は、がSelectListItemの列挙型に正しくバインドされません。バウンド、選択された選択肢をモデルのプリミティブに格納し、すべてのオプションのリストを別のフィールドに格納する必要があります。

<div class="editor-label"> 
    @Html.LabelFor(model => model.CompanyId, "Company") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CompanyId, new SelectList(Model.Companies)) 
</div> 

次に、モデルでSelectListItemsのIEnumerableを文字列のIEnumerableに変更します。

[Display(Name = "Company")]  
public string CompanyId { get; set; } 

public IEnumerable<string> Companies { get; set; } 

最後に、あなたのコントローラでは、

ViewBag.Companies = db.Companies; 

ちょうど追記として、私の代わりにあなたのIEnumerableをIListのを作ることをお勧めします。のドロップダウンメニュー は、データが表示される順番を気にするので、モデルに反映させる必要があります。

+0

ですが、なぜ' int CompanyId'ですか? –

0

選択した変数タイプが文字列でない場合、モデルの状態は常にドロップダウンで無効になります。 CompanyIdをstringに変更します。あなたはまだIEnumerable Companies {get; set;}を使用することができます

関連する問題