以下EditorTemplate无法按我的意愿运作;
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.BusinessUnitSelected>" %>
<tr>
<td><%: Model.BusinessUnit.BusinessUnitName %></td>
<td><%: Html.CheckBoxFor(model => model.Selected,
new { onclick = "SaveSelection(" + Model.EmployeeId + ", " + Model.BusinessUnit.BusinessUnitId + ", " + Convert.ToInt32(Model.Selected) + ", " + this.ClientID + ")" }) %>
</td>
</tr>
我想获取Checkbox的Id,而this.ClientID无法做到这一点。 此EditorTemplate在表格中形成行网格。 当某人点击该复选框时,会执行SaveSelection javascript;
function SaveSelection(employeeId, businessUnitId, selectedFlag, elementId) {
//var tempFlag = selectedFlag === "0";
var element = document.getElementById(elementId);
if (selectedFlag === null) {
selectedFlag = true;
} else {
selectedFlag = !selectedFlag;
}
var url = '<%: Url.Action("AddBusinessUnitForEmployee", "DataService")%>';
dataService.saveSelection(employeeId, businessUnitId, selectedFlag, elementId, SavedSetting, url);
}
SavedSetting = function(data) {
$('#' + data.ElementId).after('<span class="error">' + data.Message + '</span>');
};
我想要的是在服务器调用后在复选框旁边显示一条消息。 那我该怎么做? Upticks将获得有关如何改进此代码的建议。
答案 0 :(得分:2)
您可以使用HTML5 data-*
属性:
<%@ Control
Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<SHP.Models.BusinessUnitSelected>"
%>
<tr>
<td><%: Model.BusinessUnit.BusinessUnitName %></td>
<td>
<%= Html.CheckBoxFor(
x => x.Selected,
new {
data_url = Url.Action("AddBusinessUnitForEmployee", "DataService"),
data_employeeId = Model.EmployeeId,
data_businessUnitId = Model.BusinessUnit.BusinessUnitId
}
) %>
</td>
</tr>
然后在单独的javascript文件中不引人注意地订阅这些复选框的.click()
事件,然后从data-*
属性中获取所需信息:
$(function() {
$('tr input[type="checkbox"]').click(function() {
var elementId = $(this).attr('id');
var url = $(this).data('url');
var employeeId = $(this).data('employeeId');
var businessUnitId = $(this).data('businessUnitId');
var selectedFlag = !$(this).is(':checked');
dataService.saveSelection(
employeeId,
businessUnitId,
selectedFlag,
elementId,
SavedSetting,
url
);
});
});
备注:我无法准确记住ASP.NET MVC 2是否支持data_
语法,以便在生成的标记中将其重写为data-
语法。这在ASP.NET MVC 3及更高版本中得到了完全支持。如果它不适合你,你可以使用RouteValueDictionary
:
<%= Html.CheckBoxFor(
x => x.Selected,
new RouteValueDictionary
{
{ "data-url", Url.Action("AddBusinessUnitForEmployee", "DataService") },
{ "data-employeeId", Model.EmployeeId },
{ "data-businessUnitId", Model.BusinessUnit.BusinessUnitId }
}
) %>