1. ホーム
  2. asp.net-mvc

[解決済み] Asp.net MVC ModelState.Clear

2022-08-27 05:41:34

質問

どなたか、Asp.net MVCにおけるModelStateの役割の簡潔な定義(または1つへのリンク)を教えていただけませんか? 特に私はそれが必要であるか、または望ましいのはどのような状況で呼び出されるかを知る必要があります ModelState.Clear() .

少しオープンエンドですね。 ...すみません、私が実際にやっていることをお話しすれば、お役に立てるかもしれませんね。

私は、"Page"というコントローラでEditのアクションを持っています。 最初にページの詳細を変更するためのフォームを見たとき、すべてがうまくロードされました("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>

どのように解決するのですか?

私は、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); 
}

期待通りに動作する。

これは "feature," ではありませんよね?