c# - ASP.Net MVC 5 将表单发布时的初始模型参数传递给 Controller

标签 c# asp.net asp.net-mvc asp.net-mvc-5 model-binding

我的 Controller 中有一个创建操作。 Get Version 初始化绑定(bind)到 View 中的表单的模型,如下所示。

public ActionResult Create(int someId)
    {
        AppDbContext = new ApplicationDbContext();
        ItemViewModel model = new ItemViewModel()
        {
            SomeId = someId
        };
        return View(model);
    }

和 post 方法作为

    [HttpPost]
    public async Task<ActionResult> Create(int someId, ItemViewModel model)
    {
        //Some Code Here
        return View(model);
    }

问题是我得到一个错误:

The parameters dictionary contains a null entry for parameter 'someId' of non-nullable type 'System.Int32' for method 'System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] Create(Int32, SomeSystem.ViewModels.Admin.Some.SomeViewModel)' in 'SomeSystem.Controllers.SomeController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter. Parameter name: parameters

尽管我发布前的 URL 看起来像:

 SomeController/Create?someId=14

我也试过:

    [HttpPost]
    public async Task<ActionResult> Create(ItemViewModel model)
    {
        var myvar = model.SomeId; //SomeId is Null.
        //Some Code Here
        return View(model);
    }

我假设,我在 Create Action 的 Get 方法中初始化的值应该在发布时可用;但他们不是。

编辑: 我的 View 只是一个表单:

@model AuctionSystem.ViewModels.Admin.Item.ItemViewModel
@using (Html.BeginForm("Create", "AdminItem", FormMethod.Post, new { @class = "form-horizontal", role = "form", enctype = "multipart/form-data" }))
{ 
     //HTML Helpers for Text boxes
     //Submit Button
}

最佳答案

快速解决方案

您需要将 someId 放入表单中,以便它被发送到 Controller 方法。这不会自动发生。你应该继续你尝试的第二件事,将 SomeId 放入模型中,然后将其放入你的表单中:

@Html.HiddenFor(m => m.SomeId)

更多详情

Html.HiddenFor 是一种创建隐藏 HTML 输入元素的辅助方法。当您传入 lambda 表达式 m => m.SomeId 时,输入会从模型中获得该属性的值以及 MVC 在 Controller 方法中用于绑定(bind)到您的模型的名称,当表格已提交。这允许 someId 在用户提交表单时连同用户的输入一起发送回服务器。

在这种情况下,它生成的 HTML 将是这样的(不包括一些验证属性):

<input type="hidden" value="14" name="SomeId" />

关于c# - ASP.Net MVC 5 将表单发布时的初始模型参数传递给 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35806197/

相关文章:

c# - 使用 List<T> 创建允许 T 的子类的接口(interface)

c# - 如何在目录中查找子文件夹的名称

c# - 如何同步对 ASP.NET 中使用的 List<T> 的访问?

c# - jQuery.validate 忽略了我的规则声明

c# - 具有重复名称值 MVC 的 Http Post

asp.net-mvc - 在 IIS Express 中使用 ssl 时如何指定端口?

c# - 显示窗体弹窗一小段时间然后自动关闭

c# - 此 PHP 加密代码中使用的函数的 C# 等效项是什么?

asp.net - 在网页上嵌入可编辑的 MS Word 文档

asp.net - 如何在 ASP.NET 项目中实现 HTTPS?