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);
}

它现在的工作方式是,它将显示一个下拉列表,我可以从中选择 TLDID(按“Typ”)和 KlientID(按数据库中的“KlientID”条目)。它还要求一个“Nazwa”,这是必须写的名字。

我想删除从下拉列表中选择 KlientID 的选项,而是让 HttpPost 从链接中获取 KlientID。例子 :

  1. 我去客户的详细信息页面:/Klient/Details/6
  2. 我单击 Add_Domain 链接,该链接获取当前查看的 KlientID 并带我到:/Domena/Add_Domain/6

所以,我的问题是,如何同时修改 Get 和 Post 方法,以便在数据库中为链接中的客户端 ID 创建一个新的“domena”条目?

我是否也必须更改任何内容?

这是我当前的 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通常与Domena控制器正在处理的模型有关,所以通常是 aDomenaID而不是 a KlientID。但它应该仍然有效。我会考虑使用查询参数来更清楚地表明路由中的最后一个参数是KlientID

操作链接将是:

@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 回答