【发布时间】:2018-07-27 11:37:15
【问题描述】:
我有一个简单的 ASP.NET MVC 应用程序,我们的用户有一个表格,其中有一些选项可以编辑一些设置。
此表是使用 jQuery 动态构建的,因为这是一些遗留代码。制作表格的代码是:
function setInvoiceTable(result) {
result.OverduesPaged.forEach(function (item, index) {
var externalName = 'OverduesPaged[' + index + '].ExternalInvoiceGuid';
var debtorName = 'OverduesPaged[' + index + '].Debtor';
var visibleName = 'OverduesPaged[' + index + '].IsSelected';
var externalInvoiceGuidField = '<input type=\'hidden\' value=\'' + item.ExternalInvoiceGuid + '\' name=\'' + externalName+ '\' />';
var debtorField = '<input type=\'hidden\' value=\'' + item.Debtor + '\' name=\'' + debtorName + '\' />';
var invisibleField = '<input type=\'hidden\' value=\'false\' name=\'' + visibleName + '\' id=\'' + visibleName + '\' /></label>';
var visibleField = '<label><input type=\'checkbox\' value=\'true\' name=\'' + visibleName + '\' id=\'' + visibleName + '\' /> Start sag';
var insertStr = "<tr>" +
"<td>" + externalInvoiceGuidField + debtorField + visibleField + invisibleField + "</td>" +
"<td>" + item.InvoiceId + "</td>" +
"<td>" + item.Debtor + "</td>" +
"<td>" + item.DateString +"</td>" +
"<td>" + item.DaysSinceDueString +"</td>" +
"<td>" + item.GrossAmountString + "</td>" +
"<td>" + item.RemainderAmountString + "</td>" +
"</tr>";
$('#accounting_invoices_table').append(insertStr);
});
}
当我发布时,这对我们来说非常有效。我们的控制器中有一个端点,它具有以下签名:
[System.Web.Mvc.HttpPost]
public ActionResult StartDebtCollectionCases(UpcomingDashboardViewModel vm)
{
// code
}
我正在构建的集合是 OverduesPaged,它是我们视图模型的一部分:
public class UpcomingDashboardViewModel
{
public List<OverdueUpcomingInvoiceViewModel> OverduesPaged { get; set; }
// more stuff not relevant to question
}
这是我的挑战:
我在<tr> 行中添加了一个css 类,如下所示:
// new code added
var removeClass = 'ok';
if (item.IsAlreadyCase) {
visibleField = '<label type="text">Allerede startet</label>';
removeClass = 'remove';
} else if (item.IsBlocked) {
visibleField = '<label type="text">Sat i bero</label>';
removeClass = 'remove';
}
else if (item.Currency != "DKK") {
visibleField = '<label type="text">Faktura skal være dansk valuta</label>';
removeClass = 'remove';
}
var insertStr = "<tr class='" + removeClass + "'>" +
"<td>" + externalInvoiceGuidField + debtorField + visibleField + invisibleField + "</td>" +
// rest of code from above
现在我最终得到了一个与以前完全相同的表,但具有一个 OK 或 REMOVE 的类。
但是,当我现在执行 POST 时,整个集合 OverduesPaged 为空/空:
我尝试将类添加到 <td>,但随后集合为空/空。
有什么想法吗?
【问题讨论】:
-
注意相关,但这是生成 html 的一种脆弱/容易出错的方式。考虑一个使用 jQuery 克隆和更新的模板(类似于 this answer)
-
@StephenMuecke 像这样创建它完全是公牛,而且在我们说话的时候它正在被重写:) 但是,我只是试图以一种快速/肮脏的方式实现这个 hack,不明白为什么这不起作用
-
我假设因为如果你执行任何
if语句,那么visibleField不再是<input>,它是<label>- 它也有一个无效的type="text"属性) -
请注意您的
id属性也无效(包含[、]和.字符(HtmlHelper方法将这些字符替换为_)。而你在最初的var visibleField = ...中错过了结束</label> -
@StephenMuecke 你是对的。在标签内添加输入是有效的.. 所以我们现在很成功:) 现在我们只需要期待重新编写这个疯狂的代码:-D 想要回答吗?那我*会奖励它!
标签: asp.net .net asp.net-mvc