【问题标题】:Why is an empty Model returning to post method?为什么一个空模型返回到 post 方法?
【发布时间】:2014-01-08 15:35:19
【问题描述】:

好的,已经发布了一个类似的问题,但我没有看到适用于这种情况的答案,或者更有可能的是,我完全理解答案!

基本上我有一个 get ViewResult 和 Post ActionResult , Get 返回正确的模型,但提交时,模型返回所有​​属性为 null ? 在其他方法中有用户类似的代码并且它可以工作,任何人都可以看到问题吗? 还在学习中,所以请解释一下,谢谢。

         [HttpGet]
    public ViewResult DeleteUser(string username)
    {
        IQueryRunner<User> getUser = new NhQueryRunner<User>();
        User user = getUser.GetQueryResult(new GetNamedEntity<User>(username));

        ViewUserModel model = Mapper.Map<User, ViewUserModel>(user);

        return View("DeleteUser", model);
    }

     [HttpPost]
    public ActionResult DeleteUser(ViewUserModel model)
    {
     }

查看

   @using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post))
{
<fieldset>
    Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name)
    <input type="submit" value="Remove User"/>
</fieldset>
}

【问题讨论】:

    标签: c# asp.net-mvc-3


    【解决方案1】:

    您得到一个空模型,因为表单中模型的属性没有input 控件。即使DisplayFor 也不会在POST 中发回值。我建议这样做:

    @Html.HiddenFor(m => m.Property1)
    @Html.HiddenFor(m => m.Property2)
    @Html.HiddenFor(m => m.Property3)
    
    ...
    

    其中Property{n} 是模型上的属性。

    【讨论】:

    • 谢谢迈克尔,我确定这就是解决方案,但是在它到达 post 方法之前我遇到了一个错误,“值不能为空。参数名称:键”,(没有“键”与模型一起列出)我将不得不做更多的挖掘,但我原以为程序会在提交后立即在帖子方法上达到断点?.....干杯
    【解决方案2】:

    表单从其输入提交值。您没有名称与模型属性名称相同的输入,因此提交的表单数据不包含这些值。其他value providers(查询字符串、路由数据等)也没有与模型属性对应的值。因此,模型绑定器无法绑定值,并且您的模型的所有属性都等于 null(它们是引用类型属性)。

    您可以按照@Michael 的建议使用@Html.HiddenFor(m => m.Name)` 在表单中生成隐藏输入:

    <input id="Name" type="hidden" value="username_value" name="Name">
    

    现在,如果您检查 Request.Form 值集合,它将包含带有键 Nameusername_value 值的条目。 FormValueProvider 提供对该集合的访问以建模活页夹。并且名称为Name 的属性将被成功绑定。

    【讨论】:

    • 好像name 而不是username
    • @YairNevet 谢谢,刚刚在写答案时查看了 Get 方法参数,现在更新
    • 如何检查 Request.Form 值集合?我想我也保留了我原来的输入标签行?
    • @mkell 它在控制器操作中可用。您不需要手动验证它 - 我只是指出如果值将通过表单提交,那么它应该出现在该集合中。 Binder 会自动查找该值
    • 谢谢@SergeyBerezovskiy,我很清楚,我在视图中将我的值列为@Html.HiddenFor(m => m.FirstName) 等......并添加输入行您在上面编写的代码?...我做错了什么,因为我仍然遇到同样的错误?
    【解决方案3】:

    您需要在表单部分中有一个表单输入元素,以便浏览器可以回发到服务器。更新您的代码并添加以下属性

       @using (Html.BeginForm("DeleteUser", "Company", FormMethod.Post))
    {
    <fieldset>
        Are you sure you want to delete Username - @Html.DisplayFor(m => m.Name)
        @Html.HiddenFor(x=>x.Name)
        <input type="submit" value="Remove User"/>
    </fieldset>
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-25
      • 2020-11-10
      • 2020-10-05
      • 1970-01-01
      • 2015-09-04
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多