3

新しいデータベース エントリを作成するために HttpPost メソッドを作成しようとしています。異なるデータベース テーブルと「名前」から 2 つの外部 ID を取得する必要があります。モデルは次のとおりです。

public class Domena
{
   public int DomenaID { get; set; }  // this domains ID
   public int TLDID { get; set; }     // foreign id
   public int KlientID { get; set; }  // foreign id
   public string Nazwa { get; set; }
   public virtual TLD TLD { get; set; }
   public virtual Klient Klient { get; set; }
}

そうです、基本的にこれは私が今持っているものです:

// GET: /Domena/Add_Domain
public ActionResult Add_Domain()
{
   ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
   ViewBag.KlientID = new SelectList(db.Klienci, "KlientID", "KlientID");
   return View();
}

//
// POST: /Domena/Add_Domain

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Add_Domain(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", "KlientID", domena.KlientID);
   return View(domena);
}

現在の動作方法は、ドロップダウン リストが表示され、そこから "Typ" で TLDID を選択し、データベースの "KlientID" エントリで KlientID を選択できます。また、書かなければならない名前である「ナズワ」を求めます。

ドロップダウン リストから KlientID を選択するオプションを削除し、代わりに HttpPost がリンクから KlientID を取得するようにします。例 :

  1. クライアントの詳細ページに移動します:/Klient/Details/6
  2. Add_Domain リンクをクリックすると、現在表示されている KlientID が取得され、次のページに移動します。/Domena/Add_Domain/6

それで、私の質問は、データベースに新しい「ドメナ」エントリをリンクにあるクライアントのIDに作成するために、GetメソッドとPostメソッドの両方を変更するにはどうすればよいですか?

ビューでも何かを変更する必要がありますか?

ここに私の現在の Add_Domain ビューのフィールドセットがあります:

<fieldset>
    <legend>Domena</legend>

    <div class="editor-label">
        @Html.LabelFor(model => model.TLDID)
    </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)
    </div>
    <div class="editor-field">
        @Html.DropDownList("KlientID", String.Empty)
        @Html.ValidationMessageFor(model => model.KlientID)
    </div>
    <div class="editor-label">
        @Html.LabelFor(model => model.Nazwa)
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Nazwa)
        @Html.ValidationMessageFor(model => model.Nazwa)
    </div>

    <p>
        <input type="submit" value="Create" />
    </p>
</fieldset>

前もって感謝します!

4

1 に答える 1

1

デフォルトの MVC ルートを使用する場合は、パラメーター{controller}/{action}/{id}を活用できるはずです。idクライアント ページのAdd_Domainリンクは、ルート値を設定します。

@Html.ActionLink("Add a domain", "Add_Domain", "Domena",
    new { id = Model.KlientID }, null)

GET アクションにパラメーターを与え、このパラメーターをモデルに設定します。

public ActionResult Add_Domain(int id)
{
    ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
    var model = new Domena { KlientID = id };
    return View(model);
}

ビューで、ラベルと検証メッセージを削除KlientIDし、ドロップダウン リストを非表示の入力に置き換えます。

@Html.HiddenFor(model => model.KlientID)

POST アクションでは、行のみを削除しViewBag.KlientID = ...ます。残りは変更しないでおくことができます。MVC モデル バインダーは、隠しフィールドをdomena.KlientIDプロパティにバインドします。

このidパラメーターは、ここでは少し誤用されています。これは通常、コントローラーが扱うidモデルに関連しているためです。通常はではなくです。しかし、それでも機能するはずです。ルートの最後のパラメーターが:DomenaDomenaIDKlientIDKlientID

アクション リンクは次のようになります。

@Html.ActionLink("Add a domain", "Add_Domain", "Domena",
    new { klientID = Model.KlientID }, null)

GET アクションは次のとおりです。

public ActionResult Add_Domain(int klientID)
{
    ViewBag.TLDID = new SelectList(db.TLDs, "TLDID", "Typ");
    var model = new Domena { KlientID = klientID };
    return View(model);
}

POST アクションは同じです。作成されたリンクは/Domena/Add_Domain?klientID=6.

于 2013-04-20T13:51:12.250 に答える