簡體   English   中英

MVC使用Controller中的TryUpdateModel形式檢查表單中的模型值

[英]MVC Check model values in form using TryUpdateModel in Controller

我當前正在關注有關MVC 5的教程,並且我堅持不對用戶輸入的字段執行驗證檢查,而不會在“編輯方法”中綁定我的字段。

我已經有一個“編輯”頁面,但是從一開始它就綁定了所有字段-我遵循的教程清楚地表明我不應該這樣做。

我的原始代碼如下。 由於我一開始就綁定了所有字段,因此可以使用貨車進行檢查。 字段名稱如下所示,帶有“ if(vans.AssetID == 20)”

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit([Bind(Include = "AssetID,Batch_Number,Customer_Account_Holder,Dealer_ID, ")] Vans__ vans)
    {
        if (vans.AssetID == 20) //Example - check if data entered for AssetID is 20
        {
          //do something
        }
        if (ModelState.IsValid)
        {
            db.Entry(vans__).State = EntityState.Modified;
            db.SaveChanges();
            return RedirectToAction("Index");
        }
        return View(vans__);
    }

在本教程中,我被指示不要在一開始就綁定所有內容,而應使用如下代碼:

    public ActionResult EditPost(int? id)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

        //In here vans is the original values and not from the form.
        Vans__ vans = db.Vans__.Find(id);

       //Here how can I check if AssetID is a certain number returned from the form?

        if (TryUpdateModel(vans, "", new string[] { "AssetID" }))
        {
            try
            {
                db.SaveChanges();
                return RedirectToAction("Index");
            }
        }
    }

我知道,使用TryUpdateModel列入白名單將更加容易和安全,我只是在努力了解如何訪問從表單返回給控制器的數據。

我如何訪問模型以添加自己的驗證檢查?

感謝所有幫助,謝謝。

這不是答案。

Microsoft教程在這里 (免責聲明,我與James一起工作,並要求他通過發布問題來學習)。

並在下面寫下有關為什么我們不應該使用James鏈接的原始BIND方法的信息。

[HttpPost, ActionName("Edit")]
[ValidateAntiForgeryToken]
public ActionResult EditPost(int? id)
{
  if (id == null)
  {
    return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
  }
  var studentToUpdate = db.Students.Find(id);
  if (TryUpdateModel(studentToUpdate, "",
   new string[] { "LastName", "FirstMidName", "EnrollmentDate" }))
  {
    try
    {
        db.SaveChanges();

        return RedirectToAction("Index");
    }
    catch (DataException /* dex */)
    {
        //Log the error (uncomment dex variable name and add a line here to write a log.
        ModelState.AddModelError("", "Unable to save changes. Try again, and      if the problem persists, see your system administrator.");
    }
  }
  return View(studentToUpdate);
}

這些更改實現了安全最佳實踐,以防止發布過多信息。腳手架生成了Bind屬性,並將由模型綁定程序創建的實體添加到帶有Modified標志的實體集。 不再建議使用該代碼,因為Bind屬性會清除Include參數中未列出的字段中的所有現有數據。 將來,將更新MVC控制器腳手架,以便它不會為Edit方法生成Bind屬性。

新代碼讀取現有實體,並調用TryUpdateModel來更新發布的表單數據中用戶輸入的字段。 實體框架的自動更改跟蹤在實體上設置了Modified標志。 調用SaveChanges方法時,Modified標志使Entity Framework創建SQL語句來更新數據庫行。 並發沖突將被忽略,並且數據庫行的所有列都將更新,包括用戶未更改的列。 (后面的教程顯示了如何處理並發沖突,如果只希望更新數據庫中的各個字段,可以將實體設置為“未更改”,並將各個字段設置為“已修改”。)

作為防止過度發布的最佳實踐,TryUpdateModel參數中將要由“編輯”頁面更新的字段列入白名單。 當前沒有您要保護的額外字段,但是列出希望模型綁定程序綁定的字段可確保如果將來在數據模型中添加字段,則這些字段將被自動保護,直到您在此處明確添加它們為止。

這些更改的結果是,HttpPost Edit方法的方法簽名與HttpGet編輯方法相同。 因此,您已將方法重命名為EditPost。

暫無
暫無

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

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