【问题标题】:Html Helpers giving wrong value when given a certain nameHtml Helpers 在给定特定名称时给出错误值
【发布时间】:2015-09-25 11:40:22
【问题描述】:

我的 MVC 应用程序中发生了一件非常奇怪的事情。我正在将部分视图渲染到引导弹出窗口中。控制器动作如下所示:

[HttpGet]
    public ActionResult GetModalForm(int id)
    {
        var vm = CreateViewModel(id)
        return PartialView("MyPartialView", vm);
    }

这似乎工作正常,视图模型中有两个字段:

 public class MyViewModel
{
    public int id { get; set; }
    public int MemberId {get ; set;}
}

到目前为止一切顺利,当我在 Controller 操作中设置断点时,id 和 MemberId 字段设置正确。

现在事情变得古怪了,我的部分视图中有以下几行(用于测试问题):

@using ()
{
    @Html.TextBox("id", Model.id)
    @Html.TextBox("something", Model.id)
    <input type='submit'/>
}

当它呈现时,第一行给我一个文本框,其值等于 MemberId 字段,第二行给我一个值等于 id 字段。我真的不明白这两行如何为同一字段提供不同的值。奇怪的是为什么第二行读取的是 MemberId 字段?

以前有没有人见过这样的事情,或者有任何想法可能是什么原因造成的?我快要完蛋了。

提前感谢您的帮助。

更新:

为了帮助进一步解释正在发生的事情:如果我的视图模型属性是 id=x 和 MemberId=y。然后是以下行:

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

将呈现为:

<input type="hidden" id="id" name="id" value="y"/>

【问题讨论】:

  • 什么意思给我同一个字段的不同值 第一个是绑定到一个名为id的属性,第二个是绑定到一个名为@的属性987654327@ 但是你用属性id 的值覆盖了它的值(一个糟糕的做法)显示你生成的实际html。
  • 上面的代码会给我:
  • 不可能,除非值已经添加到ModelState。您已经在 GET 方法中为 MyViewModel 添加了一个参数,或者您从 POST 方法返回了视图,并且您尝试在返回视图之前设置属性值而不清除 ModelState。显示您的控制器方法。
  • 我确实展示了我的控制器方法。问题是操作参数 id 等同于视图模型属性 MemberId 并且在设置模型状态时优先于视图模型属性 id。将 action 参数的名称更改为 memberId 解决了该问题。
  • 我的意思是 POST 方法(如果这是问题的话)。但是您无论如何都没有显示相关代码(这是我假设您设置model.MemberId = idCreateViewModel()方法)

标签: model asp.net-mvc-5 html-helper asp.net-mvc-partialview


【解决方案1】:

您的操作接受参数id。这意味着Request["id"] 中有一个值,该值将进入ModelStateModelState 中的任何内容都优先于 Model 中设置的值。因此,绑定到“id”的文本框将采用来自Request["id"] 的值。

两件事:

  1. 最好使用*For 帮助器,因为它们允许您以强类型的方式绑定到模型属性。

    @Html.TextBoxFor(m => m.id)
    
  2. 1234563 .换句话说,如果参数id 实际上对应于MemberId,那么您的模型上应该没有id 属性,或者您应该将动作参数重命名为memberId

【讨论】:

  • 感谢您的回答。是的,我知道第 1 点,这就是为什么我将“用于测试问题”放在括号中。我尝试查看@Html.TextBox 给出的内容以尝试隔离问题,我得到了我在原始问题中解释的内容。 @Html.TextBoxFor(m => m.id) 行正确绑定到 id 属性,但它正在使用 memberId 值呈现。至于数字2,在这种情况下,动作参数“id”等效于视图模型属性“id”。
  • 从头开始,我实际上查看了代码,并且action参数是指视图模型属性MemberId。我将动作参数的名称更改为 MemberId 和 presto,一切都很好。非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-21
  • 2021-04-03
  • 1970-01-01
  • 2014-08-04
  • 2022-09-24
  • 1970-01-01
相关资源
最近更新 更多