id取自URL参数,而不是来自Model

时间:2017-02-17 13:09:08

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

我的代码有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>

form-group虽然id在模型中为null,却会显示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);
}

2 个答案:

答案 0 :(得分:1)

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

  • [FromHeader]
  • [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);
}

答案 1 :(得分:0)

HhtpGet将始终从URL获取参数。尝试使用HttpPost创建另一个方法并将模型发布到该方法然后它应该工作。

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