【问题标题】:ASP.NET MVC - Insert into database after post methodASP.NET MVC - 在发布方法后插入数据库
【发布时间】:2020-02-05 12:40:17
【问题描述】:

我有两个POST 方法,UpdateDataUpdateTank,它们从数据库中的存储过程中抛出值。我想将这些抛出的值添加到数据库表中——这就是我尝试使用POST 方法AddOrder 的原因。

AddController:

public class AddController : Controller
{
    // GET: Add
    public ActionResult Index(SlurryListOfClass SlurryListOfClass)
    {
        if (SlurryListOfClass.MesData.BatchNumber == null)
        {
            SlurryListOfClass.MesData.MatNumber = "";
            ///stuff
            SlurryListOfClass.TankParam.PH = "";
        }

        return View(SlurryListOfClass);
    }

    [HttpPost]
    public ActionResult UpdateData(string order)
    {
        SlurryListOfClass olc = new SlurryListOfClass();

        //stuff
        return View("Index", olc);
    }

    [HttpPost]
    public ActionResult UpdateTank(string tank)
    {
        SlurryListOfClass slc = new SlurryListOfClass();

        //stuff

        return View("Index", slc);
    }

    //Post method to add order
    [HttpPost]
    public ActionResult AddOrder(SlurryListOfClass obj)
    {
        AddDetails(obj);

        return View();
    }

    private SqlConnection con;

    // To Handle connection related activities
    private void connection()
    {
        string constr = ConfigurationManager.ConnectionStrings["SlurryOrderEntStoProc"].ToString();
        con = new SqlConnection(constr);
    }

    // To add records into database 
    private void AddDetails(SlurryListOfClass obj)
    {
        connection();
        string sql = "INSERT INTO ...";
        SqlCommand com = new SqlCommand(sql, con);
        com.Parameters.AddWithValue("@OrderNr", obj.InsertTable.OrderNr ?? (object)DBNull.Value);
        //...
        com.Parameters.AddWithValue("@Comment", obj.InsertTable.Comment ?? (object)DBNull.Value);
        con.Open();
        com.ExecuteNonQuery();
        con.Close();
    }
}

SlurryListOfClass 是我的主要模型,我在其中存储所有其他模型。

Index查看:

@model SlurryOrder2.Models.SlurryListOfClass

@using (Html.BeginForm("UpdateData", "Add", FormMethod.Post))
                        {
//Here I show two textboxes. The second one is the input parameter to the POST method UpdateTank.

@using (Html.BeginForm("UpdateTank", "Add", FormMethod.Post))
{
    // Here I have 20-30 texboxes. The part is completed thanks to the UpdateTank POST method and the part 
    // is filled by the user. I want to pass these values into database.
}

<div class="panel-footer panel-custom">
    <button type="button" class="btn btn-success btn-lg" id="addOrder">Add order</button>
</div>

<script>
        $(document).ready(function () {
            $("#addOrder").click(function () {
                $.ajax(
                    {
                        type: "POST", //HTTP POST Method
                        url: "Add/Index", // Controller/View
                        data: { //Passing data
                            OrderNr: $("#txtOrder2").val(), //Reading text box values using Jquery
                            //...
                            Comment: $("#comment").val()
                        }

                    });

            });
        });
    </script>

我尝试了很多方法,但在 POST 方法 UpdateDataUpdateTank 开始“工作”后,我无法将值添加到数据库中。例如,我尝试使用RedirectToAction将对象模型从POST方法UpdateTank返回到POST方法AddOrder

【问题讨论】:

  • 这里的整体流程是非常奇怪和混乱的。您有表单发布到服务器,除了返回一个空对象之外什么都不做,为不同的 URL 返回相同的视图(这本身通常是有问题的)。然后在 AJAX 调用中,您将发布到 Index 操作,它不会向数据库添加任何内容,只是再次返回相同的视图。看起来您不需要那些第一个表单及其相应的操作。看起来您只需要几个输入,然后将您的 AJAX 操作发布到AddOrder。还是我在这里遗漏了您的意图?
  • 我可能做了一些愚蠢的事情,因为这是我的第一个项目。我使用第一个表单根据存储过程中的参数填充 texbox。接下来,我想将这些填充的文本框添加到数据库中。
  • @KwiecMac 索引是 AddController 上的 HttpGet。但是您的 ajax 语句说,您正试图通过 POST 调用它。
  • @sam:由于Index 上没有明确的[HttpGet],那么它仍然处理POST 请求。但在这段代码中,它确实似乎混淆了哪些请求应该去哪里以及哪些数据。
  • @sam 现在我看到了这个错误。感谢@David,我把它变成了:url: "@Url.Action("AddOrder", "Add")"Thanks

标签: c# sql asp.net-mvc entity-framework


【解决方案1】:

对于初学者,您不需要那些以前的表单或它们相应的控制器操作。 (UpdateDataUpdateTank)。他们实际上并没有做任何事情,这只是通过简单的方式完成的大量开销(当然,根据需要设置样式和添加其他标记):

<input type="text" id="txtOrder2">
<input type="text" id="comment">

如果您愿意,也可以使用&lt;textarea&gt;。当然,如果您在Index 中绑定到返回模型中的值,那么您仍然可以为此使用模型助手。可能是这样的:

@Html.TextBoxFor(m => m.OrderNr, new { id = "txtOrder2" })

很难说出您在 Index 中返回的内容与您尝试发布到 AddOrder 的内容之间的关系。但由于您使用 jQuery AJAX 手动发布,因此您可能不需要很多框架工具,只需使用您选择的任何标记在页面上显示数据。


除此之外,在您的 AJAX 操作中,您发布到错误的控制器操作。 Index 不会向数据库添加任何内容,AddOrder 会。只需更改网址:

url: "Add/AddOrder",

如果您不确定或者它可能会相对于视图发生变化,您还可以使用服务器端帮助代码为您生成 URL:

url: "@Url.Action("AddOrder", "Add")"

【讨论】:

  • @KwiecMac:请不要发布不是答案的答案。我们鼓励您根据需要编辑问题以包含更多信息。至于您在那个“答案”中要问什么,也许您至少需要Html.TextBoxFor 绑定到Index 中返回的模型?如果是这种情况,那么您仍然可以使用它。但是为什么你需要整个表格呢?为什么需要UpdateDataUpdateTank 控制器操作?那些为你做什么?
  • 很抱歉,我无法将其作为评论。我想我开始明白这个 Html.BeginForm、UpdateData 等。没有必要。我这样做是因为我提出了来自互联网和环境的意见。谢谢你冷静地向我解释这件事。我开始重做代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 2018-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多