2017-02-17 27 views
1

我有this same problem與我的代碼,我想避免副作用,而不改變我的變量名稱。id是從URL參數,而不是從模型

即:

我的網址是(...)/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,示出了從GETid。在我的情況下,這種行爲是意想不到的並且是不希望的

有沒有辦法阻止這種不良行爲,只使用模型?


UPDATE

控制器的相關部分:

[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

你提交通過POST形式?接收操作是否標記爲POST-only? – trailmax

+0

@trailmax入口點是GET操作:'(...)/ MarriageByPersonId?id = 231'。然後調用另一個顯示視圖的私有函數。該視圖顯示錶單,其中包含無效的「id」(取自「GET模式參數」而不是「@model Marriage」)。 –

+0

你可以顯示你的控制器方法嗎? –

回答

0

HhtpGet總是會得到來自URL參數。嘗試使用HttpPost製作另一種方法,然後將模型發佈到該方法,然後它應該可以工作。

或另一個想法是嘗試刪除httpGet,並嘗試使用它沒有它。我有類似的問題。當您在查詢和模型中具有相同的屬性名稱時,似乎默認的mvc聯編程序會感到困惑。

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); 
} 
相關問題