亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Asp.net MVC ModelState.Clear

Asp.net MVC ModelState.Clear

慕工程0101907 2019-11-17 16:12:41
Asp.net MVC ModelState.Clear任何人都可以給我一個關于ModelState在Asp.net MVC中的角色的簡潔定義(或者鏈接到一個)。特別是我需要知道在什么情況下打電話是必要的或可取的ModelState.Clear()。有點開放了 ......對不起,我想如果告訴你我在做什么可能會有所幫助:我在一個名為“Page”的控制器上有一個Edit of Action。當我第一次看到表單來更改頁面的詳細信息時,所有內容都很好地加載(綁定到“MyCmsPage”對象)。然后,我單擊一個按鈕,為MyCmsPage對象的某個字段(MyCmsPage.SeoTitle)生成一個值。它生成正常并更新對象,然后我返回動作結果與新修改的頁面對象,并期望相關的文本框(使用渲染<%= Html.TextBox("seoTitle", page.SeoTitle)%>)更新...但是它顯示了加載的舊模型的值。我通過使用來解決它,ModelState.Clear()但我需要知道它為什么/如何工作所以我不只是盲目地做。的PageController:[AcceptVerbs("POST")]public ActionResult Edit(MyCmsPage page, string submitButton){     // add the seoTitle to the current page object     page.GenerateSeoTitle();     // why must I do this?     ModelState.Clear();     // return the modified page object      return View(page);  }ASPX:<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<MyCmsPage>" %> ....        <div class="c">             <label for="seoTitle">                 Seo Title</label>             <%= Html.TextBox("seoTitle", page.SeoTitle)%>            <input type="submit" value="Generate Seo Title" name="submitButton" />         </div>
查看完整描述

3 回答

?
慕桂英3389331

TA貢獻2036條經驗 獲得超8個贊

我認為是MVC中的一個錯誤。我今天花了幾個小時努力解決這個問題。

鑒于這種:

public ViewResult SomeAction(SomeModel model) {
    model.SomeString = "some value";
    return View(model); }

視圖使用原始模型呈現,忽略更改。所以我想,也許它不喜歡我使用相同的模型,所以我嘗試這樣:

public ViewResult SomeAction(SomeModel model) {
    var newModel = new SomeModel { SomeString = "some value" };
    return View(newModel); }

并且視圖仍然使用原始模型呈現。奇怪的是,當我在視圖中放置斷點并檢查模型時,它具有更改的值。但響應流具有舊值。

最終我發現了你做過的同樣的工作:

public ViewResult SomeAction(SomeModel model) {
    var newModel = new SomeModel { SomeString = "some value" };
    ModelState.Clear();
    return View(newModel); }

按預期工作。

我不認為這是一個“功能”,是嗎?



查看完整回答
反對 回復 2019-11-18
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

更新:

  • 這不是一個錯誤。

  • 請停止View()從POST操作返回。如果操作成功,請改用PRG并重定向到GET。

  • 如果您返回View()從POST動作,連續做表單驗證,并做到這一點的方式MVC設計使用內置的助手。如果你這樣做,那么你不應該使用.Clear()

  • 如果您正在使用此操作返回SPA的 ajax ,請使用web api控制器并忘記,ModelState因為您無論如何都不應該使用它。

老答案:

MVC中的ModelState主要用于描述模型對象的狀態,主要與該對象是否有效有關。本教程應該解釋很多。

通常,您不需要清除ModelState,因為它由MVC引擎為您維護。在嘗試遵守MVC驗證最佳實踐時,手動清除它可能會導致意外結果。

您似乎正在嘗試為標題設置默認值。這應該在模型對象被實例化時(在某個地方或在對象本身 - 無參數的ctor中),在get動作上進行,以便它第一次或完全在客戶端(通過ajax或其他)下載到頁面這樣看起來好像用戶輸入了它,然后它返回了已發布的表單集合。一些如何在接收表單集合時添加此值的方法(在POST操作//編輯中)導致這種奇怪的行為可能導致.Clear() 看起來適合您。相信我 - 你不想使用clear。嘗試其他一個想法。



查看完整回答
反對 回復 2019-11-18
?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

如果要清除單個字段的值,那么我發現以下技術很有用。

ModelState.SetModelValue("Key", new ValueProviderResult(null, string.Empty, CultureInfo.InvariantCulture));

注意:將 “Key”更改為要重置的字段的名稱。


查看完整回答
反對 回復 2019-11-18
  • 3 回答
  • 0 關注
  • 397 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號