使用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。例子:
- 我去客户的详细信息页面:
/Klient/Details/6
- 我点击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>
提前感谢!
如果您使用默认的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
。