2017-02-09 12 views
1

私は、EF6(モデル初)に基づいたエンティティを持つASP.NET MVCプロジェクトを持っています。だから私のエンティティはすべて私のために自動生成されます。私はエンティティSiteを持っており、先に進む前にユーザにSiteを選択させたいだけです。私はいくつかの方法を試しましたが、それらはすべて機能しますが、非常に乱雑で不必要なように見えます。ASP.NET MVCでオブジェクトのIDをフォームからアクションに渡す方法

私はフォームが(Idまたは他の何らかのメカニズムによって優れている)に提出されたときに選択されたサイトを取得し、その後、DropdownListSiteのSを作成するクリーン方法について興味がありました。

現在、私が持っている:

ユーザーがサイトを選択するよう求めているインデックス:

public ActionResult Index() 
{ 
    ViewBag.Sites = new SelectList(db.Sites.ToList(), "Id", "Name"); 
    return View(); 
} 

ビュー:

@using (Html.BeginForm("SetSite", "Home")) 
{ 
    @Html.Label("sites", "Site:"); 
    @Html.DropDownList("Sites", null, new { @class = "selectpicker" }); 

    <div style="width:100%;height:25px"></div> 
    <button class="btn btn-default" style="width:100%">Go</button> 
} 

、フォームがあるSetSiteアクションを、提出済み

[HttpPost] 
public ActionResult SetSite() 
{ 
    if (Request.Form["Sites"] != null) 
    { 
     Session["Site"] = db.Sites.Find(Request.Form["Sites"]); 
     return RedirectToAction("Home"); 
    } 
    else 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.BadRequest); 
    } 
} 

この方法にはいくつかの問題があります。まず、私は実際には@modelの機能を剃刀で利用し、それを私のSiteクラスの方に向けたいと思っていましたが、自動生成されているので、私は覗き見して、たくさんのビュープロパティを追加したくありません。 (乞食はチョーザーになれません)

第2に、Request.Form['Sites']は文字列を返し、それをintに変換するのは地獄です。

私が言及したように、@modelの機能をHtml.DropDownListForと使いたいと思います。 DBからSitesのリストを使って作業するときは可能ですか?

これをきれいに行うにはどうすればよいですか?

+2

なぜViewModelを使用しないのですか? –

+0

@ HamidMosallaビジ​​ュアルスタジオで作成した自動生成ビューを見ると、モデルファーストクラスを使用して達成しようとしていることを実行できるため、ビューモデルを使用していません。言い換えれば、VSはCRUDのビューを生成するためにただ1つのクラス、 'Site'を使うことができました。では、なぜ同じ方法でサイトを選択するためのビューを生成できないのですか?私ができるならば余分なクラスを作ることを避けたいと思います。また、足場と同じデザインパターンを続けることもできます。 –

+1

この単純なCRUD操作のためにRequest.Formを使用する必要はありません。 @modelを使ってMVC(Model-View-Controller)の構造に従います –

答えて

1

解決策1: - コントローラー: -

private List<Country> GetCountries() 
     { 
      var list = new Entity.Result<List<Entity.Country>>(); 
      list = _context.Countries.Select(tc => new Entity.Country 
      { 
       Id = tc.Id, 
       Name = tc.Name, 
       IsdCode = tc.Code, 
      }).ToList(); 
      return list.Data.Select(x => new Country 
      { 
       id = x.Id, 
       Name = x.Name, 
      }).ToList(); 
     } 

HTTPGET方法: -

public ActionResult Add(int id) 
      { 

       try 
       { 

       } 
       catch (Exception ex) 
       { 

       } 
       finally 
       { 
        ViewBag.countryList = GetCountries(); 

       } 
       return View() 
      } 

表示方法: - uが扱うHTTP POSTをフォームSubmitimgで

@Html.DropDownListFor(x => x.countryId, new SelectList(ViewBag.countryList, "id", "Name"), KahandasDhanji.Common.Localization.Application.Resources.ddlCountry, 
            new { @id = "ddlCountry", @rows = 1 }) 

HTTPPOSTメソッドのそのモデル値。

解決策2: - FormCollectionクラスFormCollectionクラスは、コントローラ内でフォームの値を取得できます。

[HttpPost] 
public ActionResult Add(FormCollection form) 
{   
    string strDDLValue = form["Sites"].ToString(); 

    return View(MV); 
} 

希望の作品!!!

+0

ありがとうございます!私はそれを実装しようとしています。ソリューション2では、フォームの値が 'int'であると仮定するとどうしますか?私は 'Convert.ToInt32(Request.Form [" Id "])'にする必要がありますか?これは私にとっては醜いです。より良い方法がありますか? –

+0

そこから、あなたはfromcollectionを使うことも、フォームデータを扱うためにviewmodelを作ることもできます。 –

1

ViewModelを使用して、文字列値をRequest.Formから変換しないようにすることができます。以下は、あなたのViewModelクラスが

public ActionResult Index() 
{ 
    List<Site> sites = db.Sites.ToList(); 

    MyViewModel model = new MyViewModel(); 

    foreach(var site in sites) 
    { 
     model.DropdownItems.Add(new SelectListItem() { Text = site.Name, Value = site.ID.ToString() }); 
    } 

    return View(model); 
} 

ビューのコードの最初の行で@model MyViewModelを追加して生成するHtml.DropDownListForメソッドを使用して以下のように変更

public class MyViewModel 
{ 
    public MyViewModel() 
    { 
     this.DropdownItems = new List<SelectListItem>(); 
    } 

    public int SelectedSiteId { get; set; } 
    public List<SelectListItem> DropdownItems { get; set; } 
} 

のようなあなたのコントローラでgetアクションメソッドをどのように見えるかですドロップダウンリスト

@model MyViewModel 

@using (Html.BeginForm("SetSite", "Home")) 
{ 
    @Html.Label("SelectedSiteId", "Site:"); 
    @Html.DropDownListFor(m => m.SelectedSiteId, Model.DropdownItems, new { @class = "selectpicker" }) 
    <div style="width:100%;height:25px"></div> 
    <button class="btn btn-default" style="width:100%">Go</button> 
} 

コントローラのポストアクションメソッドは、以下のようになります。 model.SelectedSiteIdがドロップダウンリストの選択された値になります。タイプはintなので、Convert.ToInt32(Request.Form['Sites'])などの変換を行う必要はありません。

[HttpPost] 
public ActionResult SetSite(MyViewModel model) 
{ 
    Session["Site"] = model.SelectedSiteId; 
    return RedirectToAction("Home"); 
} 
関連する問題