尝试保存记录,以便此表(提案)将其保存在另一个表的ID(客户端)下。因此,创建链接位于"详细信息"查看模板,因为当我点击该表(客户端)的详细信息时,有一个链接在其下创建一个新记录(提案)。
我确实完成了我在另一个表上完成此操作的方法,其中客户端属于另一个表,并且有一个用于创建记录的链接,因此在创建时应该只打开创建视图模板并显示关联的ID和提交时保存它(而不是脚手架下拉选择选项)。
HTML(概念)
CREATE link (which creates a proposal record under the client, see VIEW below)
控制器:
public ActionResult Create(int? clientId)
{
ViewBag.Title = "Create a Proposal";
ViewBag.PanelColor = "success";
ViewBag.ClientId = new SelectList(db.Clients, "ClientId", "FullName");
var proposal = new Proposal();
proposal.ClientId = (int)clientId;
return View(proposal);
}
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(Proposal proposal)
{
ViewBag.Title = "Create a Proposal";
ViewBag.PanelColor = "success";
if (ModelState.IsValid)
{
var client = db.Clients.Single(c => c.ClientId == proposal.ClientId);
client.Proposals.Add(proposal);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ClientId = new SelectList(db.Clients, "ClientId", "FullName", proposal.ClientId);
return View(proposal);
}
VIEW(发生POST的起始视图)
@model AppName.Models.Client
...
<a href="/proposal/create?ClientId=@Model.ClientId">CREATE</a> // yes I could use the helper as well, but that's not the point
VIEW(实际的创建视图 - 它只是香草搭建的视图)
@using (Html.BeginForm())
{
<div class="form-horizontal">
@Html.AntiForgeryToken()
<div>
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<fieldset>
<legend>Client</legend>
<div class="form-group">
<label class="control-label col-md-2">Client Full Name</label>
<div class="col-md-10">
@Html.DropDownList("ClientId", null, htmlAttributes: new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.ClientId, "", new { @class = "text-danger" })
</div>
</div>
</fieldset>
<fieldset>
<legend>Proposal Details</legend>
<div class="form-group">
<label class="control-label col-md-2">Design</label>
@*@Html.LabelFor(model => model.FullName, htmlAttributes: new { @class = "control-label col-md-2" })*@
<div class="col-md-5">
@Html.EditorFor(model => model.Carrier, new { htmlAttributes = new { @class = "form-control", @placeholder = "Carrier" } })
@Html.ValidationMessageFor(model => model.Carrier, "", new { @class = "text-danger" })
</div>
<div class="col-md-5">
@Html.EditorFor(model => model.Product, new { htmlAttributes = new { @class = "form-control", @placeholder = "Product" } })
@Html.ValidationMessageFor(model => model.Product, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Benefit Amount</label>
<div class="col-md-10">
@Html.EditorFor(model => model.BenefitAmount, new { htmlAttributes = new { @class = "form-control", @placeholder = "Benefit amount" } })
@Html.ValidationMessageFor(model => model.BenefitAmount, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-group">
<label class="control-label col-md-2">Date Created</label>
<div class="col-md-10">
@Html.EditorFor(model => model.DateCompleted, new { htmlAttributes = new { @class = "form-control", Value = System.DateTime.Now.ToString("yyyy-MM-dd") } })
@Html.ValidationMessageFor(model => model.DateCompleted, "", new { @class = "text-danger" })
</div>
</div>
</fieldset>
<div class="form-group">
<div class="col-md-12">
<input type="submit" value="Create" class="btn btn-default" />
</div>
</div>
</div>
</div>
}
ERROR
Not savin
答案 0 :(得分:1)
您所拥有的只是一个简单的HTML链接,默认情况下会为指定的href
发出GET请求。那么可能会调用你在这里发布的唯一一个响应GET的动作,即第一个Create
。此操作会将ID分配给ClientId
,但重要的是不会保存任何内容,所以我不确定为什么您会期待其他事情发生。
如果您想点击POST操作,则需要在表单中实际发布数据,这通常需要实际的表单标记和提交按钮。如果你想使用一个简单的链接,你需要将一个click事件处理程序绑定到手动发布一个表单(这有点傻)或通过AJAX提交帖子,通过收集表单数据并提交它一次到该AJAX调用中指定的URL。
您可能只想为GET操作添加某种保存功能,但这是一个错误。 GET不应该修改任何东西。所有原子动作都应该通过POST或更合适的动词来处理,例如PUT,DELETE等。
最后,您应该避免使用Bind
。这是有史以来最糟糕的事情,只会使您的代码变得脆弱并容易出错。有关详细信息,请参阅:Bind is Evil。