0

DropDownList の選択に基づいてデータベース エントリの値を取得する新しいオブジェクトをデータベースに作成しようとしています。

次の例では、新しい「Domena」オブジェクトに、クラス TLD に属するプロパティ「Cena」の値を保持させたいと考えています。プロパティ「Cena」が作成され、データベースに 10 進数値として格納されています。指定された TLD が DropDownList から選択された場合、TLD クラスから「Cena」の値を取得する必要があります。

Domena クラスのモデルは次のとおりです。

public class Domena
{
public int DomenaID { get; set; }
public int TLDID { get; set; } // foreign id
public int KlientID { get; set; }
// irrelevant code omitted
public decimal Cena { get; set; } // value which should be copied from "Cena" from TLD CLASS
public virtual TLD TLD { get; set; }
public virtual Klient Klient { get; set; }  

}

TLD クラスは次のとおりです。

public class TLD
{
public int TLDID { get; set; }
public string Typ { get; set; }
public decimal Cena { get; set; }
public virtual ICollection<Domena> Domeny { get; set; }
}

私は見てきました: http://blogs.msdn.com/b/adonet/archive/2011/01/30/using-dbcontext-in-ef-feature-ctp5-part-5-working-with-property -values.aspx しかし、自分の解決策を見つけることができませんでした。すでに試したのは、HTTP GET Create アクションの次のコードです。

    public ActionResult Create(TLD cena)
    {
        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma");
           var model = new Domena
            {
                Cena = cena.Cena
            };
        return View();
    }

しかし、値はまだ 0.00 です。これを達成する方法がわかりません。

どんな助けでも大歓迎です。


bcr answer の後に編集:

申し訳ありませんが、必要なすべてのデータを入れていません。別のドロップダウンメニューを追加してから、httpget および httpPost メソッドを実際に変更しました。どうぞ :

HTTPGET:

    public ActionResult Create()
    {
        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma");
        ViewBag.StatusID = new SelectList(db.StatusDomeny, "StatusID", "Status");

        return View();
    }

HTTP ポスト:

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Domena domena)
    {
        if (ModelState.IsValid)
        {
            db.Domeny.Add(domena);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ", domena.TLDID);
        ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "Firma", domena.KlientID);
        ViewBag.StatusID = new SelectList(db.StatusDomeny, "StatusID", "Status", domena.StatusID);
        return View(domena);
    }

私のビューは次のようになります。

    <div class="editor-label">
        @Html.LabelFor(model => model.TLDID, "TLD")
    </div>
    <div class="editor-field">
        @Html.DropDownList("TLDID", String.Empty)
        @Html.ValidationMessageFor(model => model.TLDID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.KlientID, "Klient")
    </div>
    <div class="editor-field">
        @Html.DropDownList("KlientID", String.Empty)
        @Html.ValidationMessageFor(model => model.KlientID)
    </div>

    <div class="editor-label">
        @Html.LabelFor(model => model.StatusID, "Status")
    </div>
    <div class="editor-field">
        @Html.DropDownList("StatusID", String.Empty)
        @Html.ValidationMessageFor(model => model.StatusID)
    </div>

今のところ、ご覧のとおり、「Cena」に関連するものはすべて削除しました。機能させることができなかったからです。

httpGet メソッドで理解しているように、次の行:

model.TldDropDown = new SelectList(db.TLDs, "TLDID", "Typ");

する必要があります

model.TldList = new SelectList(db.TLDs, "TLDID", "Typ");

CreateViewModel に入れたものに基づいて:

public IEnumerable<SelectListItem> TldList {get; set;}

私は正しいですか?

ただし、これを試すと、次のようなエラー メッセージが表示されます。

タイプ 'System.Web.Mvc.SelectList' を暗黙的に IEnumearble に変換することはできません。明示的な変換が存在します。キャストが足りない?

多分私が達成しようとしていることのより多くの説明:

Domena オブジェクトの作成ページがあります。TLD.Typ によってリストされた db.TLD からの TLD のリストの DropDownList があります。TLDID = 1 (DropDownList の TLD.Typ 値が表示されます) が選択された場合、TLDID = 1 に属する「Cena」の値を Domena.Cena プロパティに割り当てる必要があることを httpGet / httpPost メソッドに認識させたいと思います。 .

それがそれをよりよく説明することを願っています。

4

1 に答える 1

1

明確にしてくれてありがとう、それはかなり役に立ちます。Domenaビューはモデルとしてエンティティにバインドされていますか? それはあなたのビューサンプルにはありませんが、そうであると仮定します。

基本的に、ユーザーが選択した TLD ID を取得したら、コンテキストから TLD エンティティを取得する必要があります。その TLD エンティティは、新しい Domena オブジェクトのプロパティに入力する Cena 値を保持します。Cena 値を画面に配置するかどうか/どこに配置するかはわかりませんが、新しい値を DB にDomenaViewModel保存した後、それをのプロパティとして使用し、POST アクションで設定することができます。Domena

ここで何度も議論されているように、クラスがエンティティであると仮定するとDomena、ビュー モデルとしてエンティティを使用することはあまり良いことではありません。一般的なアプローチは、ビューモデルとして使用するDomenaViewModelクラスまたはクラスのようなものを持つようです。DomenaDto次に、必要に応じて、ビュー モデルおよびエンティティとの間で適切なフィールドをマップします。AutoMapperこのプロセスを自動化および整理するための一般的なオプションです。この特定の例ではValueInjecter.、手動で行うことは、要点を説明するのに十分簡単なはずです。

もう 1 つのことは、ViewBagは に使用されますSelectListsが、 ではViewBagが参照されることはありませんView。ここでは完全に使用をやめてViewBag、このアプローチに固執しViewModelます。TLD と Domena クラス、および Create アクションに必要なものだけに焦点を当てて、簡単に説明します。他のドロップダウンとエンティティにも同様のアプローチが使用されます。

Domena特にやりたいことがない限り、既に存在するものとまったく同じ (すべて同じ外部キーと値を持つ) DB に別のものを追加しないように注意する必要があることに注意してください。このドロップダウン アプローチは、Scott Allen の記事に基づいています。

public class DomenaViewModel
{
    public List<TLD> Tlds {get; set;} 
    public int SelectedTldId { get; set; }

    public IEnumerable<SelectListItem> TldItems
    {
        get { return new SelectList(Tlds, "TLDID", "Typ"); }
    }

    // irrelevant code omitted
}

[HttpGet]
public ActionResult Create()
{
    var model = new DomenaViewModel
      {
          Tlds = db.TLDs.ToList();
      };

    return View(model);
}

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(DomenaViewModel viewModel)
{
    if (ModelState.IsValid)
    {
        var tld = db.TLDs.Find(model.SelectedTldId); // assuming you're using DbContext
        if (tld != null)
        {
            // the mapping is best served in a different method, but we'll do it here for now
            var newDomena = new Domena
              {
                  TLD = tld,
                  Cena = tld.Cena
              }
            db.Domeny.Add(newDomena);
            db.SaveChanges();
        }
        return RedirectToAction("Index");
    }

    viewModel.Tlds = db.TLDs.ToList();
    return View(viewModel);
}

ビューの関連部分:

@model DomenaViewModel

<div class="editor-field">
    @Html.DropDownListFor(m => m.SelectedTldId, Model.TldItems)
</div>
于 2013-05-15T17:24:36.787 に答える