将ID输入从提交发送到控制器操作

时间:2019-05-29 22:34:07

标签: c# asp.net-mvc razor

我有一个视图,需要接受用户输入并将其发送到控制器操作。我已经尝试了几件事,但是在网上找到的参考文献似乎对我没有帮助。我有一个表单输入,并且列出了控制器和动作名称,但是它似乎没有传递用户输入的值。实际上,除非我将值硬编码到控制器参数中,否则进入页面时,我只会得到错误:

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);
    }

我的代码在哪里(特别是视图导入部分)错了?

2 个答案:

答案 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"];并将其与控制器中的小写边界名称映射。