【问题标题】:ASP.Net MVC 5 Pass Initial Model Parameter at Form Post to ControllerASP.Net MVC 5 在表单发布到控制器时传递初始模型参数
【发布时间】:2016-03-05 05:51:48
【问题描述】:

我的控制器中有一个创建操作。 Get 版本初始化绑定到 View 中的 Form 的模型,如下所示。

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

问题是我得到一个错误:

参数字典包含方法“System.Threading.Tasks.Task`1[System.Web.Mvc.ActionResult] Create(Int32, SomeSystem.ViewModels.Admin.Some.SomeViewModel)”在“SomeSystem.Controllers.SomeController”中。可选参数必须是引用类型、可空类型或声明为可选参数。 参数名称:参数

虽然我发帖前的网址看起来像:

 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 方法中初始化的值应该在帖子中可用;但他们不是。

编辑: 我的视图只是一个表格:

@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
}

【问题讨论】:

  • 错误是指一个有 2 个参数的方法,int someIdSomeViewModel(不是上面显示的 Create(int someId))。另请注意,您不需要 POST 方法中的 int someId 参数,因为它已经绑定到模型的属性)
  • 那么这意味着您没有为SomeId 发布值(问题在于您的观点)
  • 你没有展示你的观点,我们怎么知道你做错了什么。
  • 表单是否包含属性SomeId 的输入? (例如@Html.HiddenFor(m =&gt; m.SomeId)
  • 当然。网络是无状态的。如果您不从客户端向服务器发送数据,服务器如何知道SomeId 是什么。或者,您可以将其添加为路由参数。

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


【解决方案1】:

快速解决方案

您需要在表单中输入someId,以便将其发送到控制器方法。这不会自动发生。您应该尝试您尝试的第二件事,将 SomeId 放入模型中,然后将其放入您的表单中:

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

更多详情

Html.HiddenFor 是一个帮助方法,它创建一个隐藏的 HTML 输入元素。当您传入 lambda 表达式 m =&gt; m.SomeId 时,输入将获得模型中该属性的值以及 MVC 在提交表单时用于在控制器方法中绑定到您的模型的名称。这允许someId 在用户提交表单时连同用户的输入一起发送回服务器。

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

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

【讨论】:

  • 是的。这解决了它。感谢您和 Stephen Muecke 的帮助。
猜你喜欢
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多