我正在嘗試使用Asp.Net MVC4和Razor爲報告執行過濾頁面。要做到這一點,我開發了包含三個次要視圖模型對象列表(我將其呈現在小格子內頁)一個ViewModel類類EditorTemplates問題 - 在Post事件中僅返回列表中的第一個元素
public class DeviationReportViewModel
{
[Display(Name = "Type")]
public int Type { get; set; }
[Display(Name = "Companies")]
public List<Company> Companies { get; set; }
[Display(Name = "Departments")]
public List<Department> Departments { get; set; }
[Display(Name = "Employees")]
public List<Employee> Employees { get; set; }
public List<Event> Events { get; set; }
[Display(Name = "Event")]
public Event ChosenEvent { get; set; }
public string Event { get; set; }
public string FileType { get; set; }
}
公司,部門和員工類基本上包含ID(INT) ,名稱和描述(兩個字符串),外鍵描述的字符串屬性(例如員工所屬的部門)和Selected(布爾)屬性。對於每一個我開發像這樣的一個EditorTemplate:
// ~\Views\Shared\EditorTemplates\Employee.cshtml
@model Model.ViewModels.Employee
<tr id="@Model.Id">
<td>
@Html.CheckBoxFor(m => m.Selected, new { @class = "selectEmp" })
// I use this for filtering values between tables, using javascript
// (i.e.: to show only Employees from a Department)
</td>
<td>
@Html.HiddenFor(m => m.Name)
@Html.DisplayFor(m => m.Name)
</td>
<td>
@Html.HiddenFor(m => m.Department)
@Html.DisplayFor(m => m.Department, new { @class = "fk" })
</td>
</tr>
當我從數據庫取回這些名單,它們包含幾個對象(即:員工名單有10個對象),但是當我回來後與選擇的視圖模型,員工列表只包含一個對象。公司和部門名單不會發生這種情況。由於我不會從列表中刪除任何東西(我只是使用「Selected」屬性來正確地過濾它們),哪裏出錯?
(我已經通過this,this和this文章一派,但我還是不明白)
編輯 - 用於過濾(jQuery的數據表)JS腳本
function GetColumn(class) {
if (class == '.selectCom') {
return 1;
}
else {
return 2;
}
};
//this function returns a keyword list for filtering
function GetSearchArray(tbl, searchClass) {
if (searchClass === null || searchClass === undefined) {
searchClass = '';
return new Array();
}
else {
var searchArray = new Array();
$(searchClass).toArray().forEach(function (item, index, array) {
if ($(item).is(':checked')) {
tbl.settings.currentColumn = GetColumn(searchClass);
searchArray.push($(item).parents('tr')[0].cells[1].innerHTML);
}
});
return searchArray;
}
};
// this function effectively filters a child table based on what is selected on parent table
function TableFilter(parentTableId, parentClassName, childTableId, childClassName) {
var tbl = $(childTableId).dataTable();
var keywords = GetSearchArray($(parentTableId).DataTable(), parentClassName);
var filter = '';
keywords.forEach(function (item, index, array) {
filter = (filter !== '') ? filter + '|' + item : item;
});
tbl.fnFilter(filter, GetColumn(childClassName), true, false, false, true);
};
// These events call the filtering function and clear what is selected on child tables.
$('.selectCom').change(function() {
TableFilter('#tbCom', '.selectCom', '#tbDep', '.selectDep');
$('.selectDep').prop('checked', false);
$('.selectEmp').prop('checked', false);
});
$('.selectDep').change(function() {
TableFilter('#tbDep', '.selectDep', '#tbEmp', '.selectEmp');
$('.selectEmp').prop('checked', false);
});
先謝謝你。
你在這裏的代碼看起來很好,所以必須有其他一些問題。劇本在做什麼?你是否禁用任何元素? – 2014-10-09 21:46:14
@StephenMuecke我已經添加了腳本細節。感謝您的興趣。 – 2014-10-10 14:04:41
很難說,因爲我不熟悉'jQuery DataTables',但回發一個集合的關鍵是索引器必須開始一個零並且是連續的。如果你篩選出的項目(例如,你有''如果缺失)。如果這是問題,那麼你將需要一個'for'循環並添加一個帶有索引屬性的隱藏輸入,它允許你發回不連續的索引項('') – 2014-10-11 01:03:00