我正在尝试创建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。示例:
/Klient/Details/6
/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>
提前致谢!
答案 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}}。