[英]Model binding / ViewModel binding in ASP.Net Core MVC
讓我們從簡單的代碼開始:
public class SomeViewModel
{
public int State { get; set; }
}
public class SomeController : Controller
{
public IActionResult DoSomething(int state)
{
var viewModel = new SomeViewModel();
if(state % 2 == 0)
viewModel.State = state * 2;
else
viewModel.State = state;
return View("MyView", viewModel)
}
}
我的視圖.cshtml:
@model SomeViewModel;
...
<form method="get" asp-action="BlablaAction" asp-controller="OtherController">
<input asp-for="State">
<button type="submit">Save</button>
</form>
...
我提出要求:
/some/dosomething?state=4 => 輸入值 = 4
/some/dosomething?state=5 => 輸入值 = 5
/some/dosomething?state=6 => 輸入值 = 6
/some/dosomething?state=7 => 輸入值 = 7
但根據我在 DoSomething 動作中的邏輯,它應該是:
/some/dosomething?state=4 => 輸入值 = 8
/some/dosomething?state=5 => 輸入值 = 5
/some/dosomething?state=6 => 輸入值 = 12
/some/dosomething?state=7 => 輸入值 = 7
我的問題是:為什么將輸入值分配給查詢參數而不是傳遞的屬性 model object... 第二件事我知道我可以將參數名稱從 state 更改為 param1 但也許還有其他方法可以做到...我已經閱讀了 2 本關於 ASP.net 內核的書籍,但沒有遇到任何相關問題。
當<input asp-for="">
label 符合 HTML 時,它先從 ModelState 獲取值,然后再從您的視圖模型獲取值,因此您可以清除 ModelState 中的值
public IActionResult DoSomething(int state)
{
var viewModel = new SomeViewModel();
if (state % 2 == 0)
{
viewModel.State = state * 2;
ModelState.Clear();
}
else
viewModel.State = state;
return View(viewModel);
}
另外,你可以保留controller中的代碼,修改label即可:
<input type="number" data-val="true" data-val-required="The State field is required." id="State" name="State" value="@Model.State">
如果您的表單方法是“獲取”輸入作為查詢字符串發送,但如果您想將它們作為表單發布,您應該發布您的表單並將類型“post”分配給您的表單方法。
<form method="post" asp-action="DoSomething" asp-controller="Some">
<input asp-for="State">
<button type="submit">Save</button>
</form>
在此代碼 State 中,如果您的操作參數是 SomeViewModel 類型,則綁定到您的 SomeViewModel。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.