【问题标题】:Sending ID input from submit to controller action将 ID 输入从提交发送到控制器操作
【发布时间】:2019-05-29 22:34:06
【问题描述】:

我有一个视图,我需要获取用户输入,并将其发送到控制器操作。我已经尝试了几件事,但我在网上找到的参考资料似乎对我不起作用。我在表单中有一个输入,并且列出了控制器和操作名称,但是它似乎没有从用户输入中传递值。事实上,除非我将值硬编码到控制器参数中,否则当我到达该页面时,我只会收到错误:

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

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

【问题讨论】:

  • 您在哪个代码中将id 的值从视图传递到控制器?

标签: c# asp.net-mvc razor


【解决方案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:对于您的场景,我建议对Index 视图使用两个action 方法。一个用于显示表单的GET,第二个POST 操作方法用于在提交时从表单中获取数据。

【讨论】:

  • 好的。我会试试这个。但是,问题是,我使用相同的 Index 操作将视图返回到下表。我不知道如何处理这个问题,我希望在用户输入 ID 之前表格是空白的,然后当单击按钮时,让表格与数据一起使用。如何使用两个索引操作来完成此操作?
  • 好的,我已经按照您说的做了,并使用 HttpGet 进行了第二个操作以进行初始加载。这现在工作正常。但是,当 HttpPost Index 操作时,输入 id 并单击提交时出现此错误。参数字典包含不可空类型“System.Int32”的参数“id”的空条目,用于 Controllers.TerminalReceiptsController 中的方法“System.Web.Mvc.ActionResult Index(Int32)”。可选参数必须是引用类型、可空类型或声明为可选参数。参数名称:参数
  • 哦,我明白了。 HttpPost 操作中的参数名称必须与输入名称的声明完全相同。这行得通!!!谢谢!!! :)
【解决方案2】:

您需要将string Id = Request.Form["ID"];&lt;input type="text" name="ID" /&gt; 更改为string Id = Request.Form["id"];&lt;input type="text" name="id" /&gt;,并将其映射到控制器中的小写外围名称。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-05-23
    相关资源
    最近更新 更多