簡體   English   中英

Model 綁定/ASP.Net Core MVC 中的 ViewModel 綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM