Как передать несколько значений контроллеру MVC

#c# #jquery #ajax #asp.net-mvc

#c# #jquery #ajax #asp.net-mvc

Вопрос:

У меня есть таблица с различными фрагментами данных. У меня также есть Html.TextAreaFor для ввода текста. Вот таблица

Мне нужно записать текст в текстовой области для .. отправить его контроллеру через ajax .post

 <table class="table  table-striped table-hover  col-xl-12" id="policyTable">
<tr class="thead-dark">
    <th class="toggleMe1">
        UnderWriter
    </th>
    <th class="toggleMe2">
        @Html.DisplayNameFor(model => model.Client)
    </th>

    <th>
        Exp-Policies
    </th>

    <th>
        Exp-Date
    </th>
    <th class="hideMe">
        Date - Updated
    </th>
    <th>
        Reviewed-By
    </th>
    <th>
        Email-Created
    </th>
    <th>
        @Html.DisplayNameFor(model => model.CAB)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.LossRun)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.MMS)
    </th>
    <th>
        @Html.DisplayNameFor(model => model.Notes)
    </th>
    <th></th>
</tr>

@foreach (var item in Model)
{
    <tr id="id_@item.Id">
        <td class="hideMe">
            @Html.DisplayFor(modelItem => item.Id, new { id = "VisibleID" })
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.NewUw)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Client)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.Expiring_Policies)
        </td>

        <td>
            @Html.DisplayFor(modelItem => item.ExpDate)



        <td class="hideMe">
            @Html.DisplayFor(modelItem => item.DateUpdated)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.InsertedBy)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.EmailCreated)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.CAB)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.LossRun)
        </td>
        <td>
            @Html.DisplayFor(modelItem => item.MMS)
        </td>

        <td style="width: 25%; height: 120px;">
            <div class="form-group">
                @* @Html.LabelFor(model => model.Notes, htmlAttributes: new { @class = "control-label col-md-2" })*@
                <div class="col-md-12">
                    @Html.TextAreaFor(modelItem => item.Notes, new { @class = "form-control textAreaCS", @rows = 8 })
                    @Html.ValidationMessageFor(modelItem => item.Notes, "", new { @class = "text-danger" })
                </div>
            </div>
            <div class="col-12 ml-3">
                <div class="row">
                    <input type="submit" value="Save" id="notes" class="btn btn-outline-primary btn-sm col-2" style="font-size: 16px" />
                    <div class="col-1">
                        @if (TempData["LB"] != null)
                        {
                            <div class="alert alert-danger text-center text-capitalize" style="font-size: 16px;">
                                @TempData["LB"]
                            </div>
                        }
                    </div>
                </div>

            </div>
        </td>
        <td>
            @Html.ActionLink("Review", "EditPolicy", new { id = item.Id }, new { @class = "review" })
        </td>
    </tr>
}

</table>
  

Вот вызов ajax

     var url = "/Policy/CompletedNotes";
        var policyNotes = $("#item_Notes").text();
        var id = $("#VisibleID").val();
        $("input#notes").on('click', function () {

            alert(id);
            var data = JSON.stringify({ Id: id, polNotes: policyNotes });

            $.ajax({
                url: '/Policy/CompleteNotes',
                type: 'POST',
                contentType: 'application/json',
                data: data,
                success: function () {
                    alert('success');
                }
            });
  

Я передаю идентификатор строки и текст в текстовом поле. Вот контроллер, к которому я перехожу

   [HttpPost, ValidateInput(false)]
    public ActionResult CompletedNotes(CompletedPolicyVM completedPolicy, string Id, string polNotes)
    {


        int val = Convert.ToInt32(Id);


        using (Db db = new Db())
        {
            int id = completedPolicy.Id;


            NotesDTO notesDTO = db.notes.Find(id);

            if (notesDTO == null )
            {
                return Content("This policy cannot be found."   Id);
            }

            //instantiate a stringbuilder variable so I can append the text when inserting in db. 
            var sb = new StringBuilder();
            const char carriageReturn = (char)13;
            const char newLine = (char)10;
            string insertedDate = "Inserted on "   DateTime.Now.ToString("MM/dd/yyyy HH:mm")   " by "   User.Identity.Name;


            if (notesDTO.Notes == null || notesDTO.Notes == String.Empty)
            {
                notesDTO.Notes = sb.AppendLine(insertedDate).ToString()   " "   polNotes   "n";
            }
            else
            {
                notesDTO.Notes  = newLine   sb.AppendLine(insertedDate).ToString()   " "   polNotes   "n";
            }

            db.SaveChanges();


        }


        //Save TempData message
        TempData["SM"] = "Policy saved correctly!";

        //redirect
        return RedirectToAction("CompletedPolicies");
    }
  

Проблема:

Не работает. Он не передает значения контроллеру. Каждый раз это значение равно нулю. Я перепробовал множество различных вызовов ajax.. Ничего не работает. Я могу записать идентификатор, но не текст, и когда он достигает контроллера, он равен нулю. Если они неверны, как мне просто отправить идентификатор строки .. и текст, введенный в текстовое поле, контроллеру. ?

Комментарии:

1. 2 вещи, которые я вижу на первый взгляд, ваше действие вызывается CompletedNotes , и ваш ajax вызывает CompleteNotes . вы не должны указывать свои параметры перед вызовом вашего контроллера, просто сохраните его JSON объектом для простоты

2. Опечатка, Steve0 однако, хороший глаз. Можете ли вы привести мне пример того, что вы подразумеваете под «просто сохраните это как объект JSON»

3. в вашем посте ajax > data: { Id: id, polNotes: policyNotes } сначала не оформляйте его в строку. Также я замечаю, что действие ожидает 3 аргумента, но вы указываете только 2.

Ответ №1:

Данные, которые передают строку, а также параметр, который вы получаете как completedPolicy, пусты и не являются ее частью.

ваши данные :

 "{"Id":"id","polNotes":" policyNotes"}"
  

данные должны быть типа json

 { Id: 'id', polNotes:' policyNotes' }
  

в этом нет необходимости :

 JSON.stringify({ Id: 'id', polNotes:' policyNotes' });
  

и действие должно выглядеть:

 [HttpPost, ValidateInput(false)]
    public ActionResult CompletedNotes( int Id, string polNotes)
    {
using (Db db = new Db())
        {
CompletedPolicyVM completedPolicy=db.CompletedPolicyVM .Find(id);
    NotesDTO notesDTO = db.notes.Find(id);
.
.
.

 db.SaveChanges();
}
  

ajax :

  var data = { Id: id, polNotes: policyNotes };

            $.ajax({
                url: '/Policy/CompleteNotes',
                type: 'POST',
                contentType: 'application/json',
                data: data,
                success: function () {
                    alert('success');
                }
            });
  

Комментарии:

1. Спасибо, Саман, за ваш вклад. Теперь я получаю сообщение об ошибке «Недопустимый JSON primitive: Id». Есть идеи, что это значит?

2. заключите id в кавычки: {"id": id, "polNotes": policyNotes}

3. допустимый тип json, такой как:{«id»: 1, «polNotes»: «введите любое слово»} пожалуйста, смотрите > json.org/example.html если значение является строкой, оно должно быть в кавычках. {«ColumnName»: valuInt, «ColumnName»: «строка значения»}

4. пожалуйста, добавьте: тип данных: «json», в запросе Ajax ниже > введите: ‘POST’, с уважением.