【问题标题】:id is taken from the URL parameter, and not from the Modelid 取自 URL 参数,而不是模型
【发布时间】:2017-02-17 13:09:07
【问题描述】:

我的代码中有this same problem,我想在不更改变量名的情况下避免副作用。

即:

我的网址是(...)/MarriageByPersonId?id=231

这会搜索Person 并创建一个新的Marriage 对象(带有Marriage.id = null)。

它终于以Model=Marriage到达视图:

<div class="form-group">
    @Html.LabelFor(m => m.id)
    @Html.TextBoxFor(m => m.id, new { @class = "form-control", @readonly = "readonly" })
    @Html.ValidationMessageFor(m => m.id)
</div>

虽然id 在模型中是null,但此form-group 显示id 来自GET。在我的情况下,这种行为是意外且不受欢迎的。

有没有办法阻止这种不良行为并仅使用该模型?


更新

控制器的相关部分:

[HttpGet]
public ActionResult MarriageByPersonId(int id)
{
    var person = _personRepository.GetById(id);
    var marriage = _marriageRepository.GetById(person.marriage_id);
    return Marriage(marriage);
}

private ActionResult Marriage(Marriage marriage)
{
    var people = _personRepository.GetAll();

    ViewBag.men = Utils.GetPersonsSelectListByGender(people, isMale: true);
    ViewBag.women = Utils.GetPersonsSelectListByGender(people, isMale: false);

    return View(nameof(MarriageController.Marriage), marriage);
}

【问题讨论】:

  • 您是否通过 POST 提交表单?接收操作是否标记为 POST-only?
  • @trailmax 入口点是一个 GET 操作:(...)/MarriageByPersonId?id=231。然后调用另一个显示视图的私有函数。该视图显示了无效的 id 表单(取自 GET 参数而不是 @model Marriage)。
  • 你能展示你的控制器方法吗
  • @PatrickMcvay 我已经用控制器方法更新了这个问题。我通过在HttpGet 操作中将id 更改为personId 解决了这个问题。我认为这是一个“危险的陷阱”。这不直观,我仍然对避免这种情况的通用方法感兴趣。
  • 我不知道这会起作用,但是您是否尝试过在婚姻操作中接受 id 参数?私人 ActionResult 婚姻(int id,婚姻婚姻)

标签: c# asp.net asp.net-core


【解决方案1】:

尝试在您的 id 参数上使用属性来指定其来源。如果您不想绑定它,只需选择一个不会填充的源。你的选择是

  • [发件人]
  • [FromQuery]
  • [FromRoute]
  • [FromForm]

您显然不想要 [FromQuery],因为这是您希望避免的行为。尝试 [FromForm],如果它不存在,它应该保持未绑定。

您的代码将如下所示:

[HttpGet]
public ActionResult MarriageByPersonId([FromForm]int id)
{
    var person = _personRepository.GetById(id);
    var marriage = _marriageRepository.GetById(person.marriage_id);
    return Marriage(marriage);
}

【讨论】:

    【解决方案2】:

    HhtpGet 总是从 URL 获取参数。尝试使用 HttpPost 制作另一种方法并将您的模型发布到该方法,然后它应该可以工作。

    或者另一个想法是尝试删除 httpGet 并尝试在没有它的情况下使用它。我有类似的问题。当您在查询和模型中具有相同的属性名称时,似乎默认的 mvc binder 会混淆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-02
      • 1970-01-01
      • 1970-01-01
      • 2023-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多