我試圖爲ViewModel創建一個編輯器模板,並且我看到Kendo控件在生成後面臨着問題。循環生成Kendo DropDownListFor在jQuery中沒有正確初始化
這裏是ParkingServiceDetail.cshtml
文件:
@model List<DA.Services.CarPark.Presentation.Web.Models.ParkingServiceDetailViewModel>
<div id="@ViewData.TemplateInfo.HtmlFieldPrefix" style="margin-top:10px">
<table class="table table-bordered table-striped table-hover" id="grid">
<thead>
<tr>
<th data-field="TerminalId">Terminal</th>
<th data-field="ServiceId">Service</th>
<th data-field="ParkingCardNumber">Card Number</th>
<th data-field="ParkingCardIssueDate">Issue Date</th>
<th data-field="ParkingCardExpiryDate">Expiry Date</th>
<th data-field="ParkingCardGroup">Card Group</th>
<th>Action</th>
</tr>
</thead>
<tbody>
@if (Model != null && Model.Any())
{
for (int i = 0; i < Model.Count; i++)
{
<tr mjrole="@(Model[i].ParkingCardNumber == "viewtemplate" ? "template" : "row")" style="display:@(Model[i].ParkingCardNumber == "viewtemplate" ? "none" : "")">
<td>@Html.DropDownListFor(m => m[i].TerminalId, (IEnumerable<SelectListItem>)ViewBag.Terminals, "Select terminal", new { @class = "form-control", style = "width:150px", mjrole = ViewData.TemplateInfo.HtmlFieldPrefix + "-terminal" })</td>
<td>@Html.DropDownListFor(m => m[i].ServiceId, (IEnumerable<SelectListItem>)ViewBag.Services, "Select service", new { @class = "form-control", style = "width:150px", mjrole = ViewData.TemplateInfo.HtmlFieldPrefix + "-service" })</td>
<td>@Html.TextBoxFor(m => m[i].ParkingCardNumber, new { @class = "k-textbox form-control" })</td>
<td>@Html.TextBoxFor(m => m[i].ParkingCardIssueDate, new { @class = "form-control", style = "width:115px", mjrole = "dateIs" })</td>
<td>@Html.TextBoxFor(m => m[i].ParkingCardExpiryDate, new { @class = "form-control", style = "width:115px", mjrole = "dateEx" })</td>
<td>@Html.TextBoxFor(m => m[i].ParkingCardGroup, new { @class = "k-textbox form-control", style = "width:100px" })</td>
<td>
<button command="@ViewData.TemplateInfo.HtmlFieldPrefix-delete" id="DeptFlightSearch" type="button" class="btn btn-danger @(Model[i].TerminalId > 0 ? "disabled" : "")">
<span class="glyphicon glyphicon-remove-circle"></span>
Delete
</button>
</td>
<script type="text/javascript">
var tempParent = $("select[mjrole='@ViewData.TemplateInfo.HtmlFieldPrefix-terminal']")
.kendoDropDownList({
optionLabel: "Select terminal...",
dataTextField: "TerminalName",
dataValueField: "TerminalId",
dataSource: {
serverFiltering: true,
transport: {
read: {
url: "Ajax/GetTerminals",
dataType: "json"
}
}
}
});
$("select[mjrole='@ViewData.TemplateInfo.HtmlFieldPrefix-service']")
.kendoDropDownList({
autoBind: false,
cascadeFrom: tempParent.id,
optionLabel: "Select service...",
dataTextField: "NameEnglish",
dataValueField: "Code",
dataSource: {
serverFiltering: true,
transport: {
read: {
url: "Ajax/GetTerminalServices",
data: "filterServices",
dataType: "json"
}
}
}
});
</script>
</tr>
}
}
<tr id="@ViewData.TemplateInfo.HtmlFieldPrefix-empty" style="display: @(Model != null && Model[0].ParkingCardNumber == "viewtemplate" && Model.Count > 1 ? "none": "")">
<td colspan="7">
No services added
</td>
</tr>
<tr mjrole="footer">
<td colspan="7" style="text-align: right;">
<button id="@ViewData.TemplateInfo.HtmlFieldPrefix-AddNew" type="button" class="btn btn-outline btn-success btn-circle btn-lg">
<span class="fa fa-plus"></span>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="modal fade" id="@ViewData.TemplateInfo.HtmlFieldPrefix-popup" tabindex="-1" role="dialog">
<div class="modal-dialog" role="dialog" style="width:700px">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
<h3 class="modal-title" id="myModalLabel">Confirmation</h3>
</div>
<div class="modal-body">
<h5> Are you sure you want to delete the selected service? </h5>
<table class="table table-bordered table-striped" id="deletegrid"></table>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline btn-danger btn-circle btn-lg" data-dismiss="modal">
<span class="glyphicon glyphicon-remove"></span>
</button>
<button id="@ViewData.TemplateInfo.HtmlFieldPrefix-ok" type="button" class="btn btn-outline btn-success btn-circle btn-lg">
<span class="glyphicon glyphicon-ok"></span>
</button>
</div>
</div>
</div>
</div>
<script type="text/javascript">
$("#@ViewData.TemplateInfo.HtmlFieldPrefix").on("click", "button[command='@ViewData.TemplateInfo.HtmlFieldPrefix-delete']", function (arg) {
var row = $(arg.target).parent().closest("tr");
$('#@ViewData.TemplateInfo.HtmlFieldPrefix').prop("target", row);
$('#@ViewData.TemplateInfo.HtmlFieldPrefix-popup').modal('show');
});
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-ok").click(function() {
var row = $('#@ViewData.TemplateInfo.HtmlFieldPrefix').prop("target");
row.remove();
$("#@ViewData.TemplateInfo.HtmlFieldPrefix").find("tr[mjrole='row']").each(function (index) {
var tempControl;
tempControl = $(this).find("[id$='TerminalId']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__TerminalId");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].TerminalId");
tempControl = $(this).find("[id$='ServiceId']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ServiceId");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ServiceId");
tempControl = $(this).find("[id$='ParkingCardNumber']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardNumber");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardNumber");
tempControl = $(this).find("[id$='ParkingCardIssueDate']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardIssueDate");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardIssueDate");
tempControl = $(this).find("[id$='ParkingCardExpiryDate']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardExpiryDate");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardExpiryDate");
tempControl = $(this).find("[id$='ParkingCardGroup']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardGroup");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardGroup");
});
$('#@ViewData.TemplateInfo.HtmlFieldPrefix-popup').modal('hide');
if ($("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='row']").length > 0) {
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-empty").hide();
}
else {
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-empty").show();
}
});
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-AddNew").click(function() {
var row;
if ($("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='template']").length > 0) {
row = $("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='template']").clone();
}
else {
row = $("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='row']").first().clone();
}
row.attr("mjrole", "row").show();
row.find("input[name$='ParkingCardNumber']").val("");
row.insertAfter($("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr").not($("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='footer']")).last());
if ($("#@ViewData.TemplateInfo.HtmlFieldPrefix table tr[mjrole='row']").length > 0) {
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-empty").hide();
}
else {
$("#@ViewData.TemplateInfo.HtmlFieldPrefix-empty").show();
}
$("#@ViewData.TemplateInfo.HtmlFieldPrefix").find("tr[mjrole='row']").each(function (index) {
var tempControl;
tempControl = $(this).find("[id$='TerminalId']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__TerminalId");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].TerminalId");
tempControl = $(this).find("[id$='ServiceId']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ServiceId");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ServiceId");
tempControl = $(this).find("[id$='ParkingCardNumber']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardNumber");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardNumber");
tempControl = $(this).find("[id$='ParkingCardIssueDate']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardIssueDate");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardIssueDate");
tempControl = $(this).find("[id$='ParkingCardExpiryDate']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardExpiryDate");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardExpiryDate");
tempControl = $(this).find("[id$='ParkingCardGroup']");
tempControl.attr("id", "@(ViewData.TemplateInfo.HtmlFieldPrefix)_" + (index + 1) + "__ParkingCardGroup");
tempControl.attr("name", "@(ViewData.TemplateInfo.HtmlFieldPrefix)[" + (index + 1) + "].ParkingCardGroup");
});
$("input[mjrole='dateIs']").kendoDatePicker({ culture: "ar-AE" });
$("input[mjrole='dateEx']").kendoDatePicker({ culture: "ar-AE" });
});
function filterServices() {
return {
companyId: '@ViewData["CompanyId"]',
terminalId: $("#TerminalId").val()
};
}
</script>
這似乎令人生畏,但只有列表排序的解決方法,因爲。這是非常基本的東西。
我最初使用Html.Helpers控件,它們工作正常。但是,我需要管理每行中的幾個級聯下拉菜單。這就是爲什麼你在代之後看到腳本標籤的原因。
問題在於所有Kendo控件都無法啓動窗口小部件。我通過在JS中添加按鈕代碼後啓動它們來解決DatePicker。但他們並不真正依賴,所以很容易。儘管這兩次下降我都無法做到。
目前,在運行時,兩個下拉菜單轉換爲Kendo並處于禁用狀態,不接受任何輸入或通過瀏覽器調試程序響應任何屬性更改。
我已經確認,如果我將JS的位從tr代移動到Add按鈕單擊後,它可以工作,但我失去了需要創建級聯依賴關係的ids。
有沒有一些線程時序問題,在Kendo的情況下失敗,但不是常規控件?
更新
我確定的主要問題是劍道控件的名字是不是唯一的。在我的答案下面的新代碼。這解決了50%的問題。
目前尚不清楚你想要做什麼,但很明顯,你做了錯誤的方式。無論您想要做什麼都可以使用部分視圖和ajax來完成。 – ataravati