使用带有参数的@HTML.Action到C#控制器

本文关键字:Action 控制器 @HTML 参数 | 更新日期: 2023-09-27 18:26:01

在View中,用户将从显示的内容中检查一个或多个名称。。。

<form name=chkAttend method=post  onsubmit='return validate(this)'>                 
<div>
     @if (Model.evModel.Participants != null)
    {
       foreach (var fi in Model.evModel.Participants)
       {
           <div> 
                @if (@fi.AttendedFlag != true)
                {
                     <input type="checkbox" id="c_@fi.EnrollmentId" name="MyCheckboxes" value="@fi.EnrollmentId" />
                      <label for="c_@fi.EnrollmentId" aria-multiselectable="True"></label>
    <span></span> @fi.EnrollmentId @fi.ParticipantName                                                                                  
                 }
           </div>
        }
    }
     <input type=submit value="Confirm Attendance">
    </div> 
</form>

选择名称后,调用函数来识别选中的名称。选中的名称只需要传递给控制器。问题-我收到错误消息:错误49当前上下文中不存在名称"id"

        function validate(form) {
           var id = ""
           for (var i = 0; i < document.chkAttend.MyCheckboxes.length; i++) 
           {
              if (document.chkAttend.MyCheckboxes[i].checked)
               id += document.chkAttend.MyCheckboxes[i].value + ","
           }
           if (id == "") 
          {
              alert("Place a check mark next to event's Participant")
           }
          else 
          {
            @Html.Action("ConfirmAttendance", "Admin", new { eventid = @Model.evModel.Id, enrollid =id })
        }
            return false;
       }

如何仅将选中的项目作为控制器中函数的参数传递?

使用带有参数的@HTML.Action到C#控制器

不能像那样将服务器端部分视图注入到代码中。按照目前的情况(如果你解决了id变量引用问题),你会在Javascript中直接注入一个部分视图内联,这将创建无效的Javascript!

相反,只将JS视为客户端,并以易于访问的方式将Javascript所需的信息馈送到页面中。您可以通过注入的JS代码注入全局变量,但我强烈建议不要这样做。

相反,MVC页面可以将控制器操作URL和事件id作为data-属性注入,如下所示:

<form name="chkAttend" method="post" 
      data-action="@Url.Content("~/Admin/ConfirmAttendance")" 
      data-eventid="@Model.evModel.Id">

使用Url.Content将确保URL始终是相对于站点的,即使作为虚拟应用程序托管也是如此。

然后,您的客户端代码可以从表单中获取值,添加选定的id,并使用Ajax调用服务器操作:

例如

function validate(form) {
     var action = $(form).data('action');
     var eventId = $(form).data('eventid');

有趣的事情现在开始了,因为您需要从客户端调用服务器,例如通过Ajax,使用您选择的选项,并对结果进行处理以更改显示。

     $.ajax({ 
          // Use constructed URL (action + event id + id)
          url: action + "?eventid=" + eventId + "&enrollid=" + id,
          type: "PUT"
          success: function (data){
               // Do something with the server result
          }
     });

您没有显示控制器的ConfirmAttendance操作,所以我甚至无法猜测您返回的是什么。确保它是合适的(可以像布尔结果一样简单,也可以像插入页面的局部视图一样复杂)。