ASP. NET MVC - вставка в базу данных после публикации - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть два POST метода, UpdateData и UpdateTank, которые выбрасывают значения из хранимых процедур из базы данных. Я хочу добавить эти брошенные значения в таблицу базы данных - поэтому я пытаюсь использовать метод 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 view:

@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 UpdateData и UpdateTank начинают свою «работу». Например, я попытался вернуть объектную модель из метода POST UpdateTank, используя RedirectToAction, в метод POST AddOrder.

1 Ответ

0 голосов
/ 05 февраля 2020

Для начала вам не нужны эти предыдущие формы или соответствующие им действия контроллера. (UpdateData и UpdateTank). Они на самом деле ничего не делают, это просто тонна накладных расходов на то, что может быть достигнуто просто с помощью этого (конечно, стилизация и добавление другой разметки по мере необходимости):

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

Или используйте <textarea> вместо этого, если вам нравится. Конечно, если вы привязываетесь к значениям в возвращенной модели в Index, вы все равно можете использовать помощники модели для этого. Может быть что-то вроде:

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

Трудно сказать, как то, что вы возвращаете в Index, действительно связано с тем, что вы пытаетесь опубликовать на AddOrder. Но так как вы публикуете вручную, используя jQuery AJAX, вам, вероятно, не нужно много инструментов фреймворка, и вы можете просто отображать данные на странице, используя любую разметку, которую вы выберете.

Кроме того, в вашей AJAX операции вы отправляете сообщение о неправильном действии контроллера. Index ничего не добавляет в базу данных, AddOrder делает. Просто измените URL:

url: "Add/AddOrder",

Вы также можете использовать вспомогательный код на стороне сервера, чтобы сгенерировать URL для вас, если вы не уверены или он может измениться относительно вида:

url: "@Url.Action("AddOrder", "Add")"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...