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

时间:2013-04-19 22:04:09

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

我正在尝试创建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。它还要求一个“Nazwa”,这是必须写的名字。

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

  1. 我转到客户的详细信息页面:/Klient/Details/6
  2. 点击Add_Domain链接,该链接获取当前查看的KlientID并转到:/Domena/Add_Domain/6
  3. 所以,我的问题是,我如何修改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>
    

    提前致谢!

1 个答案:

答案 0 :(得分: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)

行动链接将是:

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

GET行动是:

/Domena/Add_Domain?klientID=6

POST动作是一样的。然后创建的链接为{{1}}。