2017-01-10 6 views
0

私はMVCとC#の新機能であり、リストから都市を複数選択して後でDBに格納できるようにしようとしています。私はこれに関するいくつかの記事のカップルを読んだが、私の問題を解決する方法を理解できませんでした。私は自分のフォームの他のすべての項目を保存することができます:C#で複数のselction/Dropdownlistを保存する方法

@using (Html.BeginForm("AddProjectInfo", "Insert", FormMethod.Post, new { 
     enctype = "multipart/form-data" 
     @id = "insertform", @class = "form-horizontal col-md-4 col-md-offset-4" 
    })) 

が、都市のそれだけですべての最初の選択した項目を保存していません。これを解決するために私を助けてくれますか?

[HttpPost] 
    public ActionResult Insert(FormCollection frm) { 
     Models.ProjectInfo p = new Models.ProjectInfo(); 
     String[] Cities= frm.GetValues("City"); 
     p.ContractId = frm[ "ContractId" ]; 
     p.Year = Convert.ToDecimal(frm[ "Year" ]); 
     p.City = Cities.ToString(); 
     p.Location = frm[ "Location" ]; 
     // Insert into the Database 
      AddProjectInfo(p); 
      ViewBag.ResponseMessage = "Submitted !"; 

    } 

私はJavaScriptを使用していることを行う方法を知っているが、C#はそれを扱うことができる方法を知ってはいけない:

<div class="form-group"> 
     <label class="col-sm-3 col-form-label text-left">City * </label> 
     <div class="col-sm-9"> 
      @Html.DropDownList(
      "City", 
      new SelectListItem[] { 
        new SelectListItem { 
         Text = "Cambridge", Value = "Ca" 
        }, 
        new SelectListItem { 
         Text = "Oxford", Value = "Ox" 
        }, 
        new SelectListItem { 
         Text = "Sheffield", Value = "Sh" 
        }     
      }, 
     "--Select Cities--", 
    new { 
     @class = "form-control", 
     required = true, 
     multiple = "multiple" 
    } 
     ) 
    </div> 
</div> 

はここに私のコントローラである:

は、ここに私の見解です。 ありがとう!

+0

public ActionResult Insert(FormCollection frm)これは、htmlの入力に対応するフィールドを持つ実際のモデルである必要があります – Steve

+0

'Multiple'で' DropDownList() 'を使用しないでください - ListBoxFor() (http://stackoverflow.com/questions/40725358/why-does-the-dropdownlistfor-lose-the-multiple-selection-after-submit-but-the-li/40732481#40732481))。そして、 'FormCollection'を使わないでください。ビューモデルを作成し、プロパティにバインドする - [この回答](http://stackoverflow.com/questions/37848223/listboxfor-not-letting-me-select-multiple-items-mvc/37848327#37848327)典型的な実装 –

答えて

0

私はそれをテストすることなく、これらの例を書いたが、それはあなたのドロップダウンリスト/リストボックスを正しく続行する方法の一般的なアイデアを与えるためだけだと先行投資を教えてくれます。また、結局のところ私はGitHubへのリンクを残すことにします。ここで私はこのような場合に特別に書いた簡単なプロジェクトを持っています。

だから、始めましょう。簡単にするために、コントローラでドロップダウンリストを作成することをお勧めします。たとえば:

はあなたがモデルを持っていると仮定しましょう:私たちは、それはDBに接続されるようにしたくないので、NotMappedある

public class Person 
{ 
    public string Name { get; set; } 
    public string Surname { get; set; } 
    public string City { get; set; } 

    [NotMapped] 
    public SelectList CitySelectList { get; set; } 
} 

お知らせCitySelectList、。 CitySelectListの値はCity

てDBに保存されます。そして、あなたはアクションメソッドを持っている:

ここ
public ActionResult Insert() 
{ 
    var person = new Person { CitySelectList = new SelectList(
    new List<SelectListItem> 
     { 
      new SelectListItem { Text = "Cambridge", Value = "Ca" }, 
      new SelectListItem { Text = "Oxford", Value = "Ox" }, 
      new SelectListItem { Text = "Sheffield", Value = "Sh" } 
     }, "Value", "Text") }; 

    return View(person); 
} 

あなたは私がPersonのインスタンスを作成し、ビューに渡していていることがわかります。これは、事前に定義された値でビューをロードする最善の方法です。この場合、最も重要な事前定義値はドロップダウンリストです。あなたは、私が2 htmlAttributesを渡すEditorForてドロップダウンリストを呼び出しています見ることができるように

@model Person 

@using (Html.BeginForm()) 
{ 
    @Html.AntiForgeryToken() 

    <div class="form-group"> 
     @Html.LabelFor(m => m.Name, htmlAttributes: new { @class = "control-label" }) 
     @Html.EditorFor(m => m.Name, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(m => m.Name, "", new { @class = "text-danger" }) 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(m => m.Surname, htmlAttributes: new { @class = "control-label" }) 
     @Html.EditorFor(m => m.Surname, new { htmlAttributes = new { @class = "form-control" } }) 
     @Html.ValidationMessageFor(m => m.Surname, "", new { @class = "text-danger" }) 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(m => m.City, htmlAttributes: new { @class = "control-label" }) 
@* Important *@ 
     @Html.EditorFor(m => m.CitySelectList, new { htmlAttributes = new { @class = "form-control", multiple = "multiple" } }) 
@* /Important *@ 
     @Html.ValidationMessageFor(m => m.City, "", new { @class = "text-danger" }) 
    </div> 

} 

ビューは次のように多かれ少なかれになります。最も重要なものはmultiple = "multiple"です。これは、私がページに表示するアイテムリストのタイプを定義するものです。どうやって?特にそれを扱うために構築されたエディタテンプレートを通して。そのコンセプトと使い方に慣れていない場合は、開始のためにthis websiteを確認することができます。この特定のエディタのテンプレートに

@model SelectList 

@{ 
    var htmlAttributes = HtmlHelper.AnonymousObjectToHtmlAttributes(ViewData["htmlAttributes"]); 
} 

@if (!htmlAttributes.ContainsKey("multiple")) 
{ 
    @Html.DropDownListFor(m => m.SelectedValue, Model.SelectListItems, htmlAttributes) 
} 
else 
{ 
    @Html.ListBoxFor(m => m.SelectedValues, Model.SelectListItems, htmlAttributes) 
} 

ワン詳細:エディタテンプレートを下に見ることができますが、私はSelectedValueの(S)のためのドロップダウンリスト/リストボックスを作成していますことに気づいたことがありますか?

[HttpPost] 
public ActionResult Insert(Person person) 
{ 
    person.City = person.CitySelectList.SelectedValues; 
    // Some code goes here 
    return View(); 
} 

それをする必要があります:それはあなたのPOSTメソッドでは、あなたはすべての値を取得しますが、あなたが扱うことができる場合は、この方法では、頭痛のビットを引き起こす可能性があるものです。しかし、私が前に言ったように、私は作業コードhereを持っていますので、どのように動作し、動作するか見ることができます。また、GitHub right hereのコードの説明も必要な場合に備えてお読みください。

+0

'new SelectList(..)を使って第1のものから2番目の同じ' IEnumerable 'を作成するのは無意味です。これは、クライアントまたはサーバ側の検証を行わず、既存のデータを編集するときに正しい双方向モデルのバインディングに使用できず、 'City'(' SelectedValues'が 'IEnumerable')の値を設定せず、' return View();などが呼び出されます。 –

+0

はい、しかし、私が最初の行で言ったように、 "(...)私はこれらの例をテストせずに書きましたが、それはあなたに一般的なアイデアを与えることです。 )。 " –

+0

一般的な考え方は、モデルプロパティ(OPの場合、 'SelectList'の' SelectedValues'プロパティではなく、 'IEnumerable SelectedCities'と言うでしょう)に強くバインドすることです:) –

0
@Html.ListBoxFor(m => m.location_code, Model.location_type)   
    [HttpPost] 
     public string SaveResults(List<int> location_code) 
     { 

      if (location_code!= null) 
      { 
       return string.Join(",", location_code); 
      } 
      else 
      { 
       return "No values are selected"; 
      } 
     } 
関連する問題