使用EF将数据插入SQL数据库

本文关键字:SQL 数据库 插入 数据 EF 使用 | 更新日期: 2023-09-27 18:10:01

我试图创建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的"type"和KlientID的"KlientID"条目在数据库中。它还要求一个"Nazwa",这是必须写的名字。

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

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

所以,我的问题是,我如何修改Get和Post方法,以便在数据库中创建一个新的"domena"条目到客户端的id,这是在链接中?

我还需要修改视图中的内容吗?

这是我当前的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>

提前感谢!

使用EF将数据插入SQL数据库

如果您使用默认的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控制器处理的模型相关,所以通常是DomenaID而不是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