9 輸入Model和防止重複Post

2022-02-24 04:39:12 字數 3463 閱讀 6426

這節講輸入model,通過action傳入乙個model,傳入進來的model通常是用來建立資料,或者是修改資料

想要從客戶端傳進來model,那麼使用者就需要輸入model及model資訊,在html裡輸入model資訊通常是使用form,所有我們想輸入的資訊肯定得有乙個頁面並且頁面裡有form,所以首先我們需要個方法導航到這個form頁面

我們可以通過httpget請求進入某個action,然後action返回含有form的view就可以了

那麼form裡面的字段是如何對應model的各個欄位呢,就是通過name屬性來對應上的

• 那麼對應上之後是怎麼傳遞呢?用http post來做操作

下面我們做跳轉含有form的頁面,首先在index.cshtml頁加上乙個跳轉

"

create

">新增乙個學生

然後在homecontroller裡新增action

public

iactionresult create()

接著我們新增create檢視

@using tutorial.web.model

@model studentcreateviewmodel

上面有個gender類,是我從model裡新加的乙個列舉

namespace

tutorial.web.model

}

我們執行,並且看下它生成的html**,可以看到有乙個input,它的型別是hidden,它的value是一串token,我們看它的name是「requestverificationtoken」,它是用來驗證這個請求的,用來防止csrf(跨站請求偽造)

通過這個token,我們可以保證提交進來的form是從我的**的這個頁面提交的,而不是一些惡意**

下面我們研究如何把form裡的字段轉化成乙個model,實際這個不是我們手動來做的,而是mvc框架自動去做的

因為我們要盡可能的保證form裡傳遞的引數和我們接收型別所有的引數要一直,student有個id屬性,而form表單裡沒有,不一致,所以我們新建乙個studentcreateviewmodel來對應form表單裡的各項

}然後我們在介面裡新增,如下圖

接著我們去服務類inmemoryrepository去實現這個介面

public

student add(student newmodel)

現在呢,我們來完善下detail這個檢視

<

html

>

<

head

>

<

meta

name

="viewport"

content

="width=device-width"

/>

<

title

>detail

title

>

head

>

<

body

>

<

div>學生資訊

div>

<

div>id:@model.id

div>

<

div>

姓名:@model.firstname @model.lastname

div>

<

div>

性別:@model.gender

div>

<

div>

出生日期:@model.birthdate.tostring("yyyy-mm-dd")

div>

<

a asp-action

="index"

>返回home

a>

body

>

html

>

這時候我們就執行,新增會發現在明細頁可以展示新添的資訊,如下圖左,但是點選返回home的時候,資料卻沒載入出來,如下圖右

那為什麼新添的資料沒有?這是因為我們註冊容器inmemoryrepository的時候選擇它的宣告週期是scoped,就是每一次http請求都會建立乙個新的例項,所以在跳回home頁面的時候,又變成了新的請求,那解決辦法就是我們把它改成singleton即可

public void configureservices(iservicecollection services)

這時候我們再執行看下結果,發現新增進來了,如下圖

這時候我們一直點繼續,就會一直提交,就會出現下面的場景,如圖

那接下來我們就來解決,或者避免這個問題

post-redirect-get

我們post之後,重定向redirect新的頁面,然後在新的頁面獲取get資料,我們改下**,如下圖

這時候我們新增乙個人,可以看到位址變成了/home/detail/4,而不是上面之前那個/home/create了,這時候我們重新整理頁面也不會重新提交表單了

然後返回home,可以看到資料都正確,如下圖

防止非法和重複提交

第一,對於不支援post的,可以簡單的使用如下 if post equals request.getmethod else 如果是servlet,可以將doget方法直接返回,不進行處理就行了 還可以採用特定的標誌來區分,比如 程式裡這樣判斷 if post equals request.getme...

linux下專案開發中防止重複定義和重複包含的方法

c或 c 原始碼,當你開啟其中的標頭檔案時,如果你是乙個心細的計算機愛好者你會發現他們寫的標頭檔案都包含在乙個條件編譯中。比如 ifndef clock h define clock h 原始碼部分 endif clock h 好了,現在說一說它們的作用。這個條件編譯的作用不體現在這個檔案中,而是體...

Token防止表單重複提交和CSRF攻擊

兩者在原理上都是通過session token來實現的。當客戶端請求頁面時,伺服器會生成乙個隨機數token,並且將token放置到session當中,然後將token發給客戶端 一般通過構造hidden表單 下次客戶端提交請求時,token會隨著表單一起提交到伺服器端。伺服器端會對token值進行...