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 メソッドに認識させたいと思います。 .
それがそれをよりよく説明することを願っています。