创建与另一个表的ID相关联的记录 - 不保存

时间:2017-07-24 17:12:41

标签: c# asp.net-mvc razor asp.net-mvc-5

尝试保存记录,以便此表(提案)将其保存在另一个表的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

1 个答案:

答案 0 :(得分:1)

您所拥有的只是一个简单的HTML链接,默认情况下会为指定的href发出GET请求。那么可能会调用你在这里发布的唯一一个响应GET的动作,即第一个Create。此操作会将ID分配给ClientId,但重要的是不会保存任何内容,所以我不确定为什么您会期待其他事情发生。

如果您想点击POST操作,则需要在表单中实际发布数据,这通常需要实际的表单标记和提交按钮。如果你想使用一个简单的链接,你需要将一个click事件处理程序绑定到手动发布一个表单(这有点傻)或通过AJAX提交帖子,通过收集表单数据并提交它一次到该AJAX调用中指定的URL。

您可能只想为GET操作添加某种保存功能,但这是一个错误。 GET不应该修改任何东西。所有原子动作都应该通过POST或更合适的动词来处理,例如PUT,DELETE等。

最后,您应该避免使用Bind。这是有史以来最糟糕的事情,只会使您的代码变得脆弱并容易出错。有关详细信息,请参阅:Bind is Evil