我有一个视图,需要接受用户输入并将其发送到控制器操作。我已经尝试了几件事,但是在网上找到的参考文献似乎对我没有帮助。我有一个表单输入,并且列出了控制器和动作名称,但是它似乎没有传递用户输入的值。实际上,除非我将值硬编码到控制器参数中,否则进入页面时,我只会得到错误:
The parameters dictionary contains a null entry for parameter 'id' of non-nullable type 'System.Int32' for method 'System.Web.Mvc.ActionResult Index(Int32)' in 'Namespace.Controllers.TerminalReceiptsController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter.
参数名称:参数
否则,当硬编码到控制器参数中时,它就可以正常工作。
下面是一些代码。
查看导入部分:
@using (Html.BeginForm("Index", "TerminalReceipts"))
{
<div>
<input type="text" name="ID" />
<input type="submit" value="Find Receipts">
</div>
string Id = Request.Form["ID"];
}
查看表格部分:
<div class="row">
<div class="col-md-12" style="overflow-y:scroll">
<table class="table table-striped table-hover table-bordered" id="terminalReceipts">
<thead>
<tr>
<th>Local Transaction Time</th>
<th>Amount</th>
<th>Receipt</th>
</tr>
</thead>
<tbody>
@foreach (var item in Model.TransactionsTests)
{
<tr>
<td>@item.TransactionTime</td>
@*<td>@Html.DisplayFor(modelItem => item.LocalTransactionTime)</td>*@
<td>@item.Amount</td>
<td>@Html.ActionLink("View Receipt", "Details", new { Key = 1 }, new { @class = "btn btn-primary btn-sm" }) <br /></td>
</tr>
}
</tbody>
</table>
</div>
控制器动作:
// GET: TerminalReceipts
public ActionResult Index(int id )
{
var model = TRBL.GetTransactionTestsData(id);
//var model = new TerminalReceiptsVM();
return View(model);
}
我的代码在哪里(特别是视图导入部分)错了?
答案 0 :(得分:1)
请尝试以下方法:
从您的视图中删除string Id = Request.Form["ID"];
,并使用button
代替按钮控件的输入:
@using (Html.BeginForm("Index", "TerminalReceipts"))
{
<div>
<input type="text" name="ID" />
<button type="submit">Find Receipt</button>
</div>
}
在控制器的操作中,将操作方法标记为POST
,以使其与GET
方法不同。
// GET: TerminalReceipts
[HttpPost]
public ActionResult Index(int id )
{
var model = TRBL.GetTransactionTestsData(id);
//var model = new TerminalReceiptsVM();
return View(model);
}
请注意,如果未将操作方法标记为POST
,则默认情况下将其视为GET
。因此,您面临的问题是您正在GET
请求中调用方法,您需要在其中将参数值作为查询字符串提供。
PS:对于您的情况,我建议对action
视图使用两种Index
方法。一种是GET
,用于显示表单,另一种是POST
操作方法,用于在提交时从表单获取数据。
答案 1 :(得分:0)
您需要将const Fs = require('fs')
const Path = require('path')
const Axios = require('axios')
const num_media = req.body.NumMedia;
const media_files = []
for (let i = 0; i <= num_media; i++) {
const id = req.body.MessageSid
const media_url = req.body[`MediaUrl{i}`];
const mime_type = req.body[`MediaContentType{i}`);
media_files.push({'media_url': media_url, 'mime_type': mime_type});
download(media_url, id);
}
async function download(url, name) {
const path = Path.resolve(__dirname, 'files', name)
const writer = Fs.createWriteStream(path)
const response = await Axios({
url,
method: 'GET',
responseType: 'stream'
})
response.data.pipe(writer)
return new Promise((resolve, reject) => {
writer.on('finish', resolve)
writer.on('error', reject)
})
}
和string Id = Request.Form["ID"];
更改为<input type="text" name="ID" />
和string Id = Request.Form["id"];
并将其与控制器中的小写边界名称映射。