【发布时间】:2016-01-01 23:13:05
【问题描述】:
我在 MVC 中有一个搜索功能来获取匹配的交易。加载事务时,将使用结果填充表。我想将此结果发布到控制器以将事务导出到 Excel 文件。问题是当我将我的视图模型发布到我的控制器时,整个视图模型是空的。我已经搜索了很多,它有很多不同的结果,但我无法让它工作。这是我的代码:
更新
查看模型:
public class TransactionsViewModel : ViewModelBase
{
public TransactionsViewModel()
{
Charges = new List<Transaction>();
Invoices = new List<Invoices>();
}
public List<Transaction> Charges { get; set; }
public List<Invoices> Invoices { get; set; }
[DisplayName("Telefonnummer")]
public string PhoneNumber { get; set; }
[DisplayName("Personnummer")]
public string PersonalIdentityNumber { get; set; }
[DisplayName("Ordernummer")]
public string OrderNumber { get; set; }
[DisplayName("Orderbeskrivning")]
public string OrderDescription { get; set; }
// A lot of other input format controls
public class Transaction
{
public string Status { get; set; }
public DateTime Date { get; set; }
public string Msisdn { get; set; }
public string OrderNo { get; set; }
public string NetsId { get; set; }
public string Reference { get; set; }
public string Message { get; set; }
public decimal Amount { get; set; }
public decimal Vat { get; set; }
public string Merchant { get; set; }
public decimal Fee { get; set; }
public string PaymentType { get; set; }
public string OrderNumber { get; set; }
public string OrderDescription { get; set; }
}
}
查看
<div id="transactionsdiv">
@using (Html.BeginForm("SearchTransactions", "Transactions", FormMethod.Get, new { @class = "merchant-form" }))
{
<div class="left-col">
<div class="form-group">
@Html.LabelFor(model => model.PhoneNumber)
@Html.EditorFor(model => model.PhoneNumber, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.PhoneNumber, "", new { @class = "text-danger" })
</div>
</div>
<div class="form-button">
<input type="submit" value="Sök" class="btn btn-primary" />
</div>
}
<div>
@Html.Partial("ExportFiles")
</div>
导出文件
<div id="">
@using (Html.BeginForm("ExportTransactions", "Transactions", FormMethod.Post, new { @class = "merchant-form" }))
{
<input type="submit" value="Exportera" class="btn btn-primary" />
if (Model.Charges != null)
{
for (int i = 0; i < Model.Charges.Count; i++)
{
<input type="hidden" name="command.Transaction[i].Date" value="@(Model.Charges[i].Date)" />
<input type="hidden" name="command.Transaction[i].Status" value="@(Model.Charges[i].Status)" />
<input type="hidden" name="command.Transaction[i].Msisdn" value="@(Model.Charges[i].Msisdn)" />
<input type="hidden" name="command.Transaction[i].OrderNo" value="@(Model.Charges[i].OrderNo)"/>
<input type="hidden" name="command.Transaction[i].NetsId" value="@(Model.Charges[i].NetsId)"/>
<input type="hidden" name="command.Transaction[i].Message" value="@(Model.Charges[i].Message)"/>
<input type="hidden" name="command.Transaction[i].Amount" value="@(Model.Charges[i].Amount)"/>
<input type="hidden" name="command.Transaction[i].Reference" value="@(Model.Charges[i].Reference)" />
}
}
}
<table id="Transaction" class="table table-striped table-bordered" width="100%" cellspacing="0" style="display: none;">
<thead>
<tr>
<th>Datum</th>
<th>Status</th>
<th class="amount-col">Msisdn</th>
<th>OrderNo</th>
<th>Netsreferens</th>
<th>Beskrivning</th>
<th class="amount-col">Belopp</th>
@if (Model.AllowRefund)
{
<th>Återköp</th>
}
</tr>
</thead>
<tbody>
@if (Model.Charges != null)
{
for (int i = 0; i < Model.Charges.Count; i++)
{
<tr>
<td class="text-col">@Model.Charges[i].Date</td>
<td>@Model.Charges[i].Status</td>
<td class="amount-col">@Model.Charges[i].Msisdn</td>
<td>@Model.Charges[i].OrderNo</td>
<td>@Model.Charges[i].NetsId</td>
<td>@Model.Charges[i].Message</td>
<td class="amount-col">@Model.Charges[i].Amount</td>
@if (Model.AllowRefund)
{
<td>
@if (Model.Charges[i].Status == "Completed")
{
<a href="/Merchants/Refund?chargeId=@(Model.Charges[i].Reference)"><button type="button" class="m-button m-button-main">Återköp< /button></a>
}
else
{
<div> </div>
}
</td>
}
</tr>
}
}
}
</tbody>
</table>
控制器
public ActionResult ExportTransactions(TransactionsViewModel command)
{
return View();
}
在此示例中未显示,但我正在使用带有 mvc 表单标签的事务表的部分视图来将该值发布到控制器。我尝试使用 for 循环而不是 for each 循环,并尝试仅插入 Html.editorFor(model => model.Charges) 来获取列表。但是每次我将模型发布到控制器时,模型都是空的。有什么建议吗?
【问题讨论】:
-
尝试使用
for循环使输入名称遵循TransactionsViewModel.Charges[0].Transaction.PhoneNumber等对象图的层次结构,并检查是否有任何不同。 -
您的局部视图不会生成任何表单控件,因此没有什么要回发的。而且由于没有可编辑的内容,因此没有任何意义的表单。不清楚你想做什么。
-
您显示的唯一控制器方法是
public ActionResult ExportTransactions(TransactionsViewModel command),并且您显示的发布到该方法的唯一视图是ExportFiles.cshtml。该表单确实不包含任何表单控件,所以我再次重复没有什么可以发回控制器 -
您创建的名称属性与您的模型完全没有关系。您不会创建这样的输入-它的
for (int i = 0; i < Model.Charges.Count; i++) { @Html.HiddenFor(m => m.Charges[i].Status)等。但是到底为什么要通过将大量数据发送到视图然后将其全部原封不动地重新发布来降低您的应用程序的性能,更不用说安全风险了。再次从数据库中获取数据 -
没问题。但是为什么你接受了一个不正确的答案(它不会绑定到你的模型上)以及它对其他用户的误导?
标签: c# asp.net-mvc