将@HTML.Action与参数一起使用到C#控制器

时间:2014-10-08 15:59:05

标签: c# jquery razor parameters html.actionlink

在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;
       }

如何仅将已检查的项目作为控制器中该功能的参数传递?

1 个答案:

答案 0 :(得分:0)

您无法像这样将代码注入服务器端局部视图。就目前而言(如果您遇到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调用服务器操作:

e.g。

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操作,因此我甚至无法猜测您要返回的内容。确保它是合适的(可以像布尔结果一样简单,也可以像插入页面的部分视图那样复杂)。