我的代码有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);
}
答案 0 :(得分:1)
尝试在id参数上使用属性来指定其来源。如果您不想绑定它,只需选择一个不会填充的源。你的选择是
您显然不希望[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绑定器会混淆。