使用带有参数的@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;
}
如何仅将选中的项目作为控制器中函数的参数传递?
不能像那样将服务器端部分视图注入到代码中。按照目前的情况(如果你解决了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
操作,所以我甚至无法猜测您返回的是什么。确保它是合适的(可以像布尔结果一样简单,也可以像插入页面的局部视图一样复杂)。