2017-11-24 15 views
0

私はいくつかの類似のポストを見つけましたが、少しの助けなしにそれを解決する方法は見つかりませんでした(他の投稿には不完全な日付があります)。asp.net MVCのデータベースからドロップダウンリストをフォームに入れます

私は、データベースからの値(表示名ですが、値としてのキーIDを保持する)を持つドロップダウンリストを表示する必要があるページがあります。このリストには、フォームの他のタイプの入力があります。

マイモデル:おそらく、ドロップダウンリストを読み込む必要があります

public class AddOfferAnnounceModel 
{ 
    public AnnounceTypeList AnnounceTypeList {get; set; } 
    public int Surface { get; set; } 
    public int SubTypeId { get; set; } 

    [Required] 
    public decimal Price { get; set; } 

    [StringLength(200, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 0)] 
    public string AnnounceDetails { get; set; } 

    public bool Net { get; set; } 
} 

public class AnnounceTypeList 
{ 
    public int SubTypeId { get; set; } 
    public string TypeDesc { get; set; } 
} 

マイコントローラー[HTTPGET]アクション(:

// GET: Announce/Add new announce 
    public ActionResult AddOffer() 
    { 
     string sql = "select typeId, typeDesc from announceTypes where parentTypeId = 1"; 
     using (SqlConnection cn = new SqlConnection(ConnectionString)) 
     { 
      cn.Open(); 
      DataTable dt = new DataTable(); 
      SqlCommand cmd = new SqlCommand(sql, cn); 
      SqlDataAdapter da = new SqlDataAdapter(cmd); 
      da.Fill(dt); 

      var apartmentTypeList = new List<AnnounceTypeList>(); 
      foreach (DataRow dr in dt.Rows) 
      { 
       var apartmentType = new AnnounceTypeList 
       { 
        SubTypeId = Convert.ToInt32(dr["TypeId"]), 
        TypeDesc = dr["TypeDesc"].ToString() 
       }; 
       apartmentTypeList.Add(apartmentType); 
      } 
      return View(); 
     } 
    } 

マイコントローラー[httpPOST] - すべての値が表示から返される場合と、データベースに挿入するクエリ

[HttpPost] 
    public ActionResult AddOffer(AddOfferAnnounceModel model) 
    { 
     bool isValid = true; // daca datele introduse in formularul anuntului sunt corecte si respecta regulile 

     if (isValid) 
     { 
      string announceDetailsItem = model.AnnounceDetails; 
      decimal priceItem = model.Price; 
      int surfaceItem = model.Surface; 
      int subTypeId = model.SubTypeId; // GETTING FROM DROPDOWNLIST !!!! 
      int netItem = Convert.ToInt32(model.Net); 
      DateTime dateItem = DateTime.Now; 

      string sql = "insert into announces (typeid, statusId, locationId, finalPrice, date, surface, net, announceDetails) values (1, 1, 1, " + priceItem + ",'" + dateItem + "'," + surfaceItem + "," + netItem + ",'" + announceDetailsItem + "')"; 
        sql += " insert into announceOfferApartments (announceId, subTypeId, yPersonTypeId) values ((select max(announceId) from announces), 6, 4)"; 

      using (SqlConnection cn = new SqlConnection(ConnectionString)) 
      { 
       cn.Open(); 
       SqlCommand cmd = new SqlCommand(sql, cn) 
       { 
        CommandType = CommandType.Text 
       }; 
       cmd.ExecuteScalar(); 
       return RedirectToAction("OfferList", "Announce"); 
       // daca datele au fost introduse in DB, se redirectioneaza catre Lista Anunturilor 
      } 
     } 
     return OfferList(); 
    } 

マイビュー:

@model myApp.com.Models.AddOfferAnnounceModel 

...

<div class="form-group"> 
     @Html.LabelFor(model => model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Price, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Price, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Surface, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Surface, new { htmlAttributes = new { @class = "form-control" } }) 
     </div> 
    </div> 

....

私が見るには複数のモデルを持つことはできません知っています。私はおそらく、すべてのパラメータを含むCombinedクラスを作成する必要がありますが、私はどのようにDataTableからリストを作成する必要があるのか​​わからない(キーと値を持つディクショナリ?!)とドロップダウンに値を表示し、コントローラ - > ActionResult AddOffer [httpPost]でパラメータsubTypeIdにキーを転送します。

同じフォームで4つの5つのドロップダウンリストを作成する必要がありますが、おそらく同じ方法になります。

おかげで、そしてあまりにも多くの反対票を受信しないことを望む:D

答えて

0

実際には、ドロップダウンリストやその他のデータに表示されるデータを保持するView Modelを作成する必要があります。これはHttpPostによってポストバックされます。ここにステップがあります。最初のビューモデルとなり、新しいクラスを作成:

public class AddOfferViewModel 
{ 

    public AddOfferAnnounceModel Model {get;set;} 

    public SelectList AnnouncementTypeSelectList {get;set;} 

    public AddOfferViewModel() 
    { 
     Model = new AddOfferAnnounceModel(); 
    } 

} 

を、今追加オファーのあなたのGETアクションであなたは、ビューモデルを構成し、ビューに渡す必要があります:

// GET: Announce/Add new announce 
public ActionResult AddOffer() 
{ 
    string sql = "select typeId, typeDesc from announceTypes where parentTypeId = 1"; 
    using (SqlConnection cn = new SqlConnection(ConnectionString)) 
    { 
     cn.Open(); 
     DataTable dt = new DataTable(); 
     SqlCommand cmd = new SqlCommand(sql, cn); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 

     var apartmentTypeList = new List<AnnounceTypeList>(); 
     foreach (DataRow dr in dt.Rows) 
     { 
      var apartmentType = new AnnounceTypeList 
      { 
       SubTypeId = Convert.ToInt32(dr["TypeId"]), 
       TypeDesc = dr["TypeDesc"].ToString() 
      }; 
      apartmentTypeList.Add(apartmentType); 
     } 

     AddOfferViewModel viewModel = new AddOfferViewModel(); 
     viewModel.AnnouncementTypeSelectList = new SelectList(apartmentTypeList,"SubTypeId","TypeDesc") 
     return View(viewModel); 
    } 
} 

今すぐあなたの

@model myApp.com.ViewwModels.AddOfferViewModel 
... 
<div class="form-group"> 
     @Html.LabelFor(model => model.Model.Price, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Model.Price, new { htmlAttributes = new { @class = "form-control" } }) 
      @Html.ValidationMessageFor(model => model.Model.Price, "", new { @class = "text-danger" }) 
     </div> 
    </div> 

    <div class="form-group"> 
     @Html.LabelFor(model => model.Model.Surface, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      @Html.EditorFor(model => model.Model.Surface, new { htmlAttributes = new { @class = "form-control" } }) 
     </div> 
    </div> 

を、今、あなたは次のようにドロップダウンリストを追加することができます:ビューが強くAddOfferViewModelで入力する必要があります

@Html.DropDownListFor(model=>model.Model.SubTypeId,Model.Model.AnnouncementTypeSelectList) 

またList<AnnouncementType>を保持するためのViewModelにプロパティを追加して、ビューでDropDownListForメソッド呼び出し内SelectListインラインを作成することです、それ以外の方法を行うことができます。

その場合

、プロパティを置き換える:

public SelectList AnnouncementTypeSelectList {get;set;} 

と:

public List<AnnounceTypeList> AnnouncementTypes {get;set;} 

とあなたのアクションで、あなただけのようになりましたAnnouncementTypesを設定します:

// GET: Announce/Add new announce 
public ActionResult AddOffer() 
{ 
    string sql = "select typeId, typeDesc from announceTypes where parentTypeId = 1"; 
    using (SqlConnection cn = new SqlConnection(ConnectionString)) 
    { 
     cn.Open(); 
     DataTable dt = new DataTable(); 
     SqlCommand cmd = new SqlCommand(sql, cn); 
     SqlDataAdapter da = new SqlDataAdapter(cmd); 
     da.Fill(dt); 

     var apartmentTypeList = new List<AnnounceTypeList>(); 
     foreach (DataRow dr in dt.Rows) 
     { 
      var apartmentType = new AnnounceTypeList 
      { 
       SubTypeId = Convert.ToInt32(dr["TypeId"]), 
       TypeDesc = dr["TypeDesc"].ToString() 
      }; 
      apartmentTypeList.Add(apartmentType); 
     } 

     AddOfferViewModel viewModel = new AddOfferViewModel(); 
     viewModel.AnnouncementTypes = apartmentTypeList ; 
     return View(viewModel); 
    } 
} 

とでドロップダウンリストを作成するには、次の行が表示されます。

@Html.DropDownListFor(model=>model.Model.SubTypeId, 
          new SelectList(Model.Model.AnnouncementTypes, 
              "SubTypeId", 
              "TypeDesc")) 

希望に役立つ!

+0

ありがとう。 AddOfferAnnounceModelクラスのAnnouncementTypesを作成するのを忘れないでください:Dこれは完璧な作業で、AddOffer [httpPost]の値を保存します。 –

+0

幸いです –

0

あなたは、あなたのビューモデルにあなたのSELECT要素のneeededオプションを渡すタイプList<SelectListItem>の一つと選択した値のための1つを2つのプロパティを追加することができます。

public class AddOfferAnnounceModel 
{ 
    public List<SelectListItem> Items { set;get;} // These 2 properties for the dropdown 
    [Required] 
    public int SelectedItem { set;get;} 

    public int Surface { get; set; }  
    [Required] 
    public decimal Price { get; set; }  
    public string AnnounceDetails { get; set; } 

    public bool Net { get; set; } 
} 

は、今すぐあなたのGETアクションで、あなたは、あなたのAddOfferAnnounceModelのオブジェクトを作成Itemsプロパティを移入し、ビューにそれを渡すことができます。 DataTableを使用する必要はありません。 SqlReaderを使用するのは、結果を一度読んで気にすることだけです。強くAddOfferAnnounceModelクラスに型付けされたビューでは、

public ActionResult AddOffer() 
{ 
    var vm = new AddOfferAnnounceModel(); 
    vm.Items = GetItems(); 
    return View(vm); 
} 
public List<SelectListItem> GetItems() 
{ 
    var list = new List<SelectListItem>(); 
    var sql = "select TypeId, TypeDesc from announceTypes where parentTypeId = 1"; 
    var conStr = @"yourConnectionStringGoesHere"; 
    using (var c = new SqlConnection(conStr)) 
    { 
     using (var cmd = new SqlCommand(sql, c)) 
     { 
      c.Open(); 
      using (var r = cmd.ExecuteReader()) 
      { 
       if (r.HasRows) 
       { 
        while (r.Read()) 
        { 
         var t = new SelectListItem() 
         { 
          Value = r.GetInt32(r.GetOrdinal("TypeId")).ToString(), 
          Text = r.GetString(r.GetOrdinal("TypeDesc")) 
         }; 
         list.Add(t); 
        } 
       } 
      } 
     } 
    } 
    return list; 
} 

、あなたは、今すぐあなたのHttpPostアクションで、フォームが送信されたときに選択されたオプションの値をHtml.DropDownListForヘルパー

@model AddOfferAnnounceModel 
@using(Html.BeginForm()) 
{ 
    @Html.TextBoxFor(a=>a.Price) 
    @Html.TextBoxFor(a=>a.Surface) 
    @Html.TextBoxFor(a=>a.AnnounceDetails) 
    @Html.DropDownListFor(a=>a.SelectedItem,Model.Items) 
    <input type="submit" /> 
} 

を使用することができますあなたはより多くのドロップダウンを使用している場合、あなたは同じことを行います

[HttpPost] 
public ActionResult AddOffer(AddOfferAnnounceModel model) 
{ 
    // check model.SelectedItem and use that for saving 
} 

SelectedItem財産であること(2つのプロパティ、リストのための1つを追加し、 1つは選択された値になり、リストプロパティに値を設定し、DropDownListForヘルパーを使用します。

また、新しいレコードを保存するための挿入クエリの文字列連結を行わないことをお勧めします。そのアプローチはSQLインジェクション攻撃を受けやすい。 SqlParametersを見て、それを使ってあなたのクエリにあなたの別のパラメータを渡す方法。 This postは、それを処理するためのさまざまな方法を説明しています

+0

ご返信ありがとうございます。以前の投稿の方法を使用しました。そして、SQLインジェクションについてのアドバイスをありがとう...私はそれに慎重にしようとします。ありがとう。 –

関連する問題