讓我們從簡單的代碼開始:
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)
}
}
MyView.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
我的問題是:為什么將輸入值分配給查詢引數而不是傳遞的模型物件的屬性...第二件事我知道我可以將引數的名稱從 state 更改為 param1 但也許還有其他方法可以做到...我已經閱讀了兩本關于 ASP.net 核心的書籍,但沒有遇到任何相關內容。
uj5u.com熱心網友回復:
當<input asp-for="">標簽符合 HTML 時,它會先從 ModelState 中獲取值,然后再從您的 viewmodel 中獲取值,因此您可以清除 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);
}
另外,您可以將代碼保留在控制器中,只需修改標簽:
<input type="number" data-val="true" data-val-required="The State field is required." id="State" name="State" value="@Model.State">
uj5u.com熱心網友回復:
默認情況下,如果我們分配GET給表單的方法屬性,它會通過查詢字串公開資料。為了避免這種情況,我們將方法屬性設定為POST
<form method="post" asp-action="DoSomething" asp-controller="Some">
<input asp-for="State">
<button type="submit">Save</button>
</form>
其次,.NET Core 提高了安全性,所以官方檔案推薦這樣在 Post Method 中使用 Model。(這是可選的最佳實踐。不是強制性的)
public class StateModel
{
public int State { get; set; }
}
public class SomeController : Controller
{
public IActionResult DoSomething(StateModel model)
{
var viewModel = new SomeViewModel();
if(model.State % 2 == 0)
viewModel.State = state * 2;
else
viewModel.State = state;
return View("MyView", viewModel)
}
}
uj5u.com熱心網友回復:
如果您的表單方法是“get”輸入作為查詢字串發送,但如果您想將它們作為表單發布,您應該發布您的表單并將型別“post”分配給您的表單方法。
<form method="post" asp-action="DoSomething" asp-controller="Some">
<input asp-for="State">
<button type="submit">Save</button>
</form>
如果您的實際引數是 SomeViewModel 型別,則在此代碼中狀態系結到您的 SomeViewModel。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/438718.html
標籤:C# 网 asp.net-mvc asp.net 核心 剃刀
