2012-04-15 9 views
0

私のアプリケーションでは、さまざまな選択肢を表すドロップダウンリストがあります。 Paragraphはモデルであり、セクションはモデル内の1つのフィールドにすぎないことに注意してください。MVC 3モデルにバインドしないドロップダウンリスト

@Html.DropDownList("Sections") 

これは私のコントローラです。

public ActionResult Edit(int id) 
{ 
    var paragraph = db.Paragraphs.Find(id); 

    ViewBag.Sections = new SelectList(
     db.Sections.Select(s => new { s.ID, s.Name }), 
     "ID", "Name", paragraph.SectionID 
    ); 

    return View(paragraph); 
} 

[HttpPost] 
public ActionResult Edit(Paragraph paragraph, HttpPostedFileBase document) 
{ 
    if (ModelState.IsValid) 
    { 
     // Do some stuff. 
    } 

    ViewBag.Sections = new SelectList(
     db.Sections.Select(s => new { s.ID, s.Name }), 
     "ID", "Name", paragraph.SectionID 
    ); 

    return View(paragraph); 
} 

ドロップダウンリストはモデルにバインドされていませんが、フォームを送信すると、 ModelState.IsValidが偽であり、私の人生が恐ろしいものになってしまった。助言がありますか?

EDIT

There is no ViewData item of type 'IEnumerable<SelectListItem>' that has the key 'Sections'. 

EDIT:私がファイルを送信しようとすると、私は前のエラーを取得することが表示されます私は、私は次のエラーを取得するフォームを送信します。

EDIT:モデル

public class Paragraph 
{ 
    public int ID { get; set; } 

    [Required] 
    public int Major { get; set; } 

    [Required] 
    public int Minor { get; set; } 

    [Required(ErrorMessage = "Name is required")] 
    [StringLength(4000)] 
    public string Name { get; set; } 

    public int SectionID { get; set; } 
    public virtual Section Section { get; set; } 
} 

フォーム:(。それはたくさんだ)あなたが強くHtml.TextBoxForなどのようなヘルパーを入力し使用していない理由を

<form class="form-horizontal" action="/Paragraph/Edit" method="post" enctype="multipart/form-data"> 
    <fieldset> 
     <div class="control-group"> 
      <label class="control-label" for="section">Section</label> 
      <div class="controls"> 
       @Html.DropDownList("Sections") 
      </div> 
     </div> 
     <div class="control-group"> 
      <label class="control-label" for="major">Major</label> 
      <div class="controls"> 
       <input type="number" class="input-large" name="major" value="@Model.Major" /> 
      </div> 
     </div> 
     <div class="control-group"> 
      <label class="control-label" for="minor">Minor</label> 
      <div class="controls"> 
       <input type="number" class="input-large" name="minor" value="@Model.Minor" /> 
      </div> 
     </div> 
     <div class="control-group"> 
      <label class="control-label" for="name">Name</label> 
      <div class="controls"> 
       <input type="text" class="input-large" name="name" value="@Model.Name" /> 
      </div> 
     </div> 
     <div class="control-group"> 
      <label class="control-label" for="document">Document</label> 
      <div class="controls"> 
       <input type="file" class="input-file" name="document" /> 
      </div> 
     </div> 
     <div class="form-actions"> 
      <input type="submit" class="btn btn-primary" value="Save" /> 
      <a class="btn" href="/Paragraph/Show/@Model.ID">Cancel</a> 
     </div> 
    </fieldset> 
</form> 

答えて

0

をこれが遅れているが、より良い後半決してない。 HtmlHelperによって提供されるヘルパーの1つを使用すると、背後でinputという名前が生成されます。この名前の生成形式はModel.Fieldです。たとえば、 "Name"というフィールドを持つ段落はParagraph.Nameになります。

1つのパラメータを受け入れるDropDownListの定義では、inputの名前としてドロップダウンリストの名前が使用されます。したがって、DropDownList("Sections")を呼び出すと、「Sections」という名前のinputが作成されます。

しかし、私はRazorに譲歩し、組み込みのHTMLヘルパーを使用することにしました。したがって、私のドロップダウンリストコードはDropDownListFor(vm => vm.Paragraph.SectionID, Models.Sections)のようになります。

+1

ViewModelsと強く型付けされたヘルパーを使用するのが一般的です。あなたがそれを整理してうれしいです。 – GraemeMiller

1

は不思議?

を必要とする場合は

@Html.DropDownListFor(model =>model.SectionID,(IEnumerable<SelectListItem>) ViewBag.Sections) 

その他

は、ファイルがにあなたのモデルを与える必要があります <input type="file" class="input-file" name="document" />

することができ

@Html.HiddenFor(model =>model.ID) 
@Html.TextBoxFor(model =>model.Name) 
@Html.TextBoxFor(model =>model.Major) 
@Html.TextBoxFor(model =>model.Minor) 

私はあなたのドロップダウンリストを作ると思います、オプションのHTMLは、彼らと一緒に属性を渡すことができますに結合する。あなたは正しい名前などを取得することが確実になります。また、IDをフォームの一部として含めています。

+0

 <select id="StateList" name="StateList"></select> <script> $(document).ready(function() { var URL = "/ControllerName/GetStates"; $.getJSON(URL, function (data) { var items = '<option>Selecione o estado</option>'; $.each(data, function (i, State) { items += "<option value='" + State.Value + "'>" + State.Text + "</option>"; // state.Value cannot contain ' character. We are OK because state.Value = cnt++; }); $('#StateList').html(items); //$('#CitiesTrID').show(); }) }); 

は、上のカスケードの例を手に入れましたいくつかの詳細。基本的に、ドロップダウンリストはモデルの一部であり、モデルにバインドされていません。 –

+0

ビューのフォームと段落モデルを投稿できますか。 – GraemeMiller

1
HTMLコードは、に変更し

:あなたはこのページのためのモデルを持っていない場合は、以下のコードを使用し

@Html.DropDownListFor(m => m.SectionID, ViewBag.Sections as SelectList) 

@Html.DropDownList("Sections", ViewBag.Sections as SelectList) 
+0

本当に変です。ファイルをアップロードしていないときは 'GET'と' POST'で動作します。しかし、私がファイルを供給すると、それは狂ってしまい、エラーになる。 –

+0

エラーは何ですか? –

+0

違うファイルを試しましたか?ファイルまたは文書というプロパティはモデルに含まれていないため、ファイルの有無がモデル状態の検証に影響する理由はわかりません – GraemeMiller

0

奇妙なことだ!私は以前使用していた

@Html.DropDownList("permissionsID", String.Empty) 

それはうまくいった - すべての突然同じ問題を受けています。 DDLは、だから私は

@Html.DropDownListFor(model => model.permissionID, (IEnumerable<SelectListItem>)ViewBag.permissionsID) 

を使用し、それがうまく働いた)

を(投稿)を作成し、コントローラのメソッドにその選択した値を提出されていません!

しかし、古いコントローラを使用していますが、これは古いコントローラを使用しています。これは新しいコントローラのためのものではありません。それは本当にロジックを覆す

カスケードドロップダウンリスト

を行うとき...

+0

サイトにようこそ - あなたはこれを言い換えることができますので、声を出して考えるのではなく、手元にある質問への回答に似ていますか?ありがとう! – BoltClock

0

友達は同じ問題を抱えていないし、親DropDownListコントロールをバインドするために、なぜ何があります。だから、私は親のドロップダウンリストをすぐに同じ方法で埋めることでした。 jsonで呼び出され、jqueryで埋められたアクションを作成しました。

コントローラ上の私の行動:

public ActionResult GetStates() 
    { 
     if (Request.IsAjaxRequest()) 
     { 
      using (MyModel banco = new myModel()) 
      { 

       return Json(new SelectList(banco.SyStates.ToList(), "StateId", "StateName"), JsonRequestBehavior.AllowGet); 

      } 
     } 
     return View(); 

    } 

ビュー:私は反映するために、私の質問(最初の段落)を更新 http://blogs.msdn.com/b/rickandy/archive/2012/01/09/cascasding-dropdownlist-in-asp-net-mvc.aspx

関連する問題