簡體   English   中英

將列添加到 Model 后更新 Controller 和視圖

[英]Updating Controller and Views after adding column to Model

我是實體框架的新手,所以這可能是一個愚蠢的問題。

我在 Model class 中添加了一個新字段。 我已經創建了遷移並更新了數據庫,這一切都按預期工作。 新列已出現在 SQL 表中。

我手動修改了創建/詳細信息視圖(我猜這不是自動的)以包含新列。 新列稱為“級別”。

但是,我的 Controller class 似乎沒有接受這些變化。 創建新行時它不會插入該值。 Controller class 中有對列名的引用,但沒有新的列名。 例如

public async Task<IActionResult> Create([Bind("Id,Name")] Course course)

有什么方法可以“刷新” Controller 以獲取更改? 或者我是否必須手動編輯列命名的行並添加新列?

如果您的視圖有一個控件綁定到這個新的 Level 字段,並且您想將它傳遞給 controller 進行寫入,那么您需要將其添加到Bind屬性中:

public async Task<IActionResult> Create([Bind("Id,Name,Level")] Course course)

雖然它可能看起來像當您將 Model 傳遞給視圖時,並且在視圖中有一個表單,該表單調用 Controller 上的操作,將 Model 傳遞回來,但實際上並沒有發生這種情況。 ASP.Net MVC 只是以這種方式格式化代碼。 老實說,在使用 EF 實體時,這是一種不好的做法,因為它讓很多開發人員期望實體引用在服務器和視圖之間傳遞。 它會導致令人困惑的問題,並且在使用不當時也會為數據篡改敞開大門。

When the controller passes the Model to the View() , it is passing that Model to the View Renderer to compose the HTML view that will be sent to the browser. 因此,如果您要傳遞課程實體,該實體不會傳送到客戶端,服務器會使用它來構建 HTML。

當您的表單調用 controller 時,它將自動 append 它知道的任何綁定字段。 這將包括任何綁定的條目控件,如果有任何細節沒有綁定到它們的編輯控件,則需要使用綁定的隱藏控件以確保 MVC Javascript 也知道選擇這些控件。

如果您使用Bind屬性,這會告訴 MVC 哪些屬性從您實際想要接受的表單提交或 Ajax 調用返回。 如果“Level”不存在,即使通過,該值也將被忽略。 View 不傳遞實際的實體,它將是一組命名參數,MVC 具有一些神奇的智能,可以根據約定將其轉換為 Model object。

動作可以寫成:

public async Task<IActionResult> Create([Bind("Id,Name,Level")] Course course)

或者

public async Task<IActionResult> Create(int id, string name, string level)

在第二種情況下,您需要使用傳入的值來處理 Course 實體的創建和填充。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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