2011-10-30 19 views
1

物品ビューモデルはasp.netのMVC 3

public class ArticleViewModel : ViewModelBase 
    { 

     [Required(ErrorMessage = "Required")] 
     public string Title { get; set; } 
     [Required(ErrorMessage = "Choose the language")] 
     public BELocale Locale { get; set; } 
} 

public class BELocale : BEEntityBase 
    { 

     public string OriginalName { get; set; } 
     public string FriendlyName { get; set; } 
     public string TwoLetterISOName { get; set; } 
    } 

ビュー "AddLocaleForArticle"

@model Models.ArticleViewModel 

@using (Html.BeginForm("VefifyAddingLocaleForArticle", "Administration")) 
{ 

@Html.TextBoxFor(m => m.Title, new { disabled = "disabled" }) 
@Html.DropDownListFor(m => m.Locale, 
        new SelectList(ViewBag.AvalaibleLocales, "ID", "OriginalName"), "Select a language" 
       ) 
    @Html.ValidationMessageFor(m => m.Locale) 
    <input type="submit" value="Save" />   
} 

作用

public ActionResult VefifyAddingLocaleForPhoto(ArticleViewModel article) 
     { 
      //article.Locale == null for some reason. 
      //but article.Title isn't null, it contains the data 
      return RedirectToAction("AddingLocaleForPhotoSuccess", "adminka"); 
     } 

なぜarticle.Locale内のDropDownListの値を選択しましょうそれはヌルと等しく、それを修正する方法は?

+0

ドロップダウンリストの名前をHTMLで確認してください –

+0

名前はHTMLの "ロケール"です。 – Alexandre

+0

"ID"がビューモデルに存在しないようです – Tassadaque

答えて

2

では、あなたのビューモデル

public List<KeyValuePair<int, String>> locale 
     { 
      get 
      { 
       return _localerepo.Findlocals().Select(x => new KeyValuePair<int, string>(x.ID, x.OriginalName)).ToList(); 
      } 
     } 

に、このようなドロップダウンを満たしてもよいです。したがって、ドロップダウンリストを使用して、BELocaleなどの複雑なオブジェクト全体にデータを挿入することは期待できません。 IDプロパティを設定し、このIDを使用してデータストアからオブジェクトの残りを取得するのが最善です。対応するコントローラのアクション内部の今

@Html.DropDownListFor(
    m => m.Locale.ID, 
    new SelectList(ViewBag.AvalaibleLocales, "ID", "OriginalName"), 
    "Select a language" 
) 

あなたがIDを取得します:それは最初の引数としてロケールのIDプロパティにバインドされるように

つまり、あなたのドロップダウンリストヘルパーを変更する必要があります

public ActionResult VefifyAddingLocaleForPhoto(ArticleViewModel article) 
{ 
    // article.Locale.ID will contain the selected locale id 
    // so you can use this information to fetch the corresponding BELocale object 
    ... 
} 
+0

'@Html.DropDownList(" ddlCountry "、新しいSelectList(ViewBag.lstCountry、" CountryID "、" CountryName "))'です。特定の国を選択すると、** countroller **に 'CountryID'を渡したいと思います。 * jQuery *を使ってどうすればできますか? **注:**私は**使用していません**強く型付けされたビュー* – barnes

0

あなたはあなたのビューの使用フォームは、ドロップダウンリストを提出し、コントローラにのみ選択された値を送信している。この

<%:Html.DropDownListFor(x => x.ID, new SelectList(Model.locale, "key", "value"), "--Select locale--")%> 
       <%= Html.ValidationMessageFor(model => model.ID)%>