在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;
}
如何仅将已检查的项目作为控制器中该功能的参数传递?
答案 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
操作,因此我甚至无法猜测您要返回的内容。确保它是合适的(可以像布尔结果一样简单,也可以像插入页面的部分视图那样复杂)。