Передача выбранного строкового значения из таблицы в представлении контроллеру

#javascript #asp.net #asp.net-mvc #asp.net-core #model-view-controller

#javascript #asp.net #asp.net-mvc #asp.net-core #модель-представление-контроллер

Вопрос:

Я работаю над ASP.NET Основное веб-приложение, в котором у меня есть таблица в моем представлении, которая отображает все запросы. каждая запись с выпадающим списком успешно заполняется всеми аналитиками из моей базы данных, поэтому менеджер может назначить аналитика из выпадающего списка, а затем одобрить запрос.

Мои вопросы:

  1. Могу ли я реализовать это с помощью формы для каждой записи вместо использования JavaScript, я имею в виду использование только тегов asp?

  2. Если это должно быть сделано с помощью JavaScript, вот моя попытка реализовать это. Следующий код работает, только если идентификатор аналитика является целым числом, но в моем случае идентификатор аналитика является строкой, поэтому всякий раз, когда я пытаюсь выполнить это, я получаю либо «null», либо «Ноль» для идентификатора аналитика в контроллере. Вот моя ViewModel

 public class RequestViewModel
{
    public IEnumerable<Request> Requests { get; set; }
    public IEnumerable<ApplicationUser> AnalystList { get; set; }
    public Institution Institution { get; set; }
    public string selectedAnalyst { get; set; }
}
  

Вот мой контроллер

       public async Task<IActionResult> ApproveRequest(int id, int Analystid)
            {
    
                Request Req = await _db.Request
                    .Include(c => c.Institution)
                    .FirstOrDefaultAsync(c => c.Id == id);
    
                if (Req.Type == SD.TypeRegister)
                {
                    Req.Institution.Status = SD.StatusApproved;
                    Req.Institution.ApprovalDate = DateTime.Now;
                    Req.Institution.Seats = Req.Seats; // new
                    Req.Institution.AnalystId = Analystid.ToString(); //Here I want to get the id as string
    
                }
                else if (Req.Type == SD.TypeSeat)
                {
                    Req.Institution.Seats  = Req.Seats;
                }
                else if (Req.Type == SD.TypeSubscription)
                {
                    Req.Institution.Seats = Req.Seats;
                    Req.Institution.Status = SD.StatusApproved;
                    Req.Institution.ApprovalDate = DateTime.Now;
                }
    
                Req.isDone = true;
                await _db.SaveChangesAsync();
                return await CreateApproval(id, SD.StatusApproved);
            }
  

Вот мое мнение

      @model TestApplication.Models.ViewModels.RequestViewModel
        @using TestApplication.Extensions
        @{
            ViewData["Title"] = "Index";
        }
    
            <div class="tab-pane fade show active" id="Register" role="tabpanel" aria-labelledby="Register-tab">
    
                Registration Requests 
                <div>
                    @if (Model.Requests.Count() > 0)
                    {
                        <table class="table table-striped">
                            <tr class="table-secondary">
                                <th>
                                   Institution Name
                                </th>
                                <th>
                                    Date
                                </th>
                                <th>
                                    Actual seat
                                </th>
                                <th>
                                    Seats
                                </th>
                                <th>
                                   New Seat
                                </th>
                                <th>
                                    Choose Analyst
                                </th>
                                <th>
                                    Accept / Reject
    
                                </th>
                                <th>
                                    Details
                                </th>
                                <th>
                                </th>
                            </tr>
                            @foreach (var item in Model.Requests)
                            {
                                @if (item.Type == "Register" amp;amp; item.Institution.Status == "Pending") @*need one*@
                                {
                        <tr>
                            <td>
                                @Html.DisplayFor(m => item.Institution.Name)
                            </td>
                            <td>
                                @Html.DisplayFor(m => item.Date)
                            </td>
                            <td>
                                @Html.DisplayFor(m => item.Institution.Seats)
                            </td>
                            <td>
                                @Html.DisplayFor(m => item.ActualSeats)
                            </td>
                            <td>
                                @Html.DisplayFor(m => item.Seats)
                            </td>
                            <td>
                                <select id="selectedAnalyst_@item.Id" asp-for="selectedAnalyst" asp-items=" Model.AnalystList.ToSelectListItem(Model.selectedAnalyst)" class="form-control">
                                       <option selected value="">--- Choose ---</option>
                                </select>
                            </td>
                            <td>
                                  <a class="btn btn-info" asp-controller="Request" asp-action="ApproveRequest" asp-route-id="@item.Id"> accept </a>
                                  <a class="btn btn-info" asp-controller="Request" asp-action="RejectRequest" asp-route-id="@item.Id"> Reject </a>
                            </td>
                            <td>
                                <button type="submit" class="btn btn-success anchorDetail" data-target="#modal-@item.Institution.Id" data-toggle="modal">
                                    View Details
                                </button>
                            </td>
                            <td>
                                <div class="modal fade" id="modal-@item.Institution.Id" tabindex="-1" role="dialog" aria-hidden="true">
                                    <div class="modal-dialog-centered modal-dialog" role="document">
                                        <div class="modal-content">
                                            <div class="modal-header bg-success text-light justify-content-center">
                                                <h5 class="modal-title">Request Details</h5>
                                            </div>
                                            <div class="modal-body justify-content-center" id="MyModalContent">
                                                @await Html.PartialAsync("_RequestDetails", item)
                                            </div>
                                            <div class="modal-footer">
                                                <button type="button" class="btn btn-secondary" data-dismiss="modal">إغلاق</button>
                                            </div>
                                        </div>
                                    </div>
                                </div>
                            </td>
                        </tr>
                                }
                            }
                        </table>
                    }
                    else
                    {
                        <p>No Institutions Exists...</p>
                    }
                </div>
    
    
            </div>
    @section scripts
    {
        <script>
    
            function accept(id) {
                var aid = $('#selectedAnalyst_'   id).val()
                location.href = "/Request/ApproveRequest?id="   id   "amp;Analystid="   aid
            }
    
    
    
            var PostBackURL = '/Request/RequestDetails';
            $(function () {
                $(".anchorDetail").click(function () {
                    var $buttonClicked = $(this);
                    var id = $buttonClicked.attr('data-id');
                    $.ajax({
                        type: "GET",
                        url: PostBackURL,
                        contentType: "application/json; charset=utf-8",
                        data: { "Id": id },
                        cache: false,
                        datatype: "json",
                        success: function (data) {
                            $('#MyModalContent').html(data);
                            $('#myModal').modal('show');
                        },
                        error: function () {
                            alert("Dynamic content load failed.");
                        }
                    });
                })
        </script>
    }
    
    <div class="modal fade" id="MyModal" tabindex="-1" role="dialog"
         aria-labelledby="myModalLabel">
        <div id='MyModalContent'></div>
    </div>
  

Ответ №1:

Если вы хотите передать @item.id и $(‘#selectedAnalyst_’ id).val() контроллеру с формой, вы можете сделать следующим образом.Вот демонстрационная работа (поместить форму за пределы выпадающего списка и кнопки):

           <form method="post"
                      asp-controller="Request"
                      asp-action="ApproveRequest"
                      asp-route-id="@item.Id">
                    <td>
                        <select id="selectedAnalyst_@item.Id" asp-for="selectedAnalyst" class="form-control">
                            <option selected value="">--- Choose ---</option>
                            <option selected value="1">1</option>
                            <option selected value="2">2</option>
                            <option selected value="3">3</option>

                        </select>
                    </td>
                    <td>

                        <button type="submit">Accept</button>
                    </td>
          </form>
  

Контроллер (измените Analystid на selectedAnalyst , чтобы вы могли привязывать asp-for="selectedAnalyst" , и если вы хотите получить строковый параметр, вы можете изменить его на string selectedAnalyst ):

 public IActionResult ApproveRequest(int id,string selectedAnalyst)
        {
            return Ok();
        }
  

Результат:
введите описание изображения здесь