【问题标题】:Inserting data into SQL database using EF使用 EF 将数据插入 SQL 数据库
【发布时间】:2013-04-19 22:04:08
【问题描述】:

我正在尝试创建 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>

提前致谢!

【问题讨论】:

    标签: c# database entity-framework asp.net-mvc-4 http-post


    【解决方案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 控制器正在处理的模型有关,所以通常是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

    【讨论】:

    • 工作就像一个魅力!我还将“return RedirectToAction(Index)”替换为“return RedirectToAction("Details", new RouteValueDictionary(new { controller = "Klient", Id = klientID }));"它工作得非常好,让我回到客户详细信息页面。
    猜你喜欢
    • 1970-01-01
    • 2019-11-22
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多