19

モデル

class Address
{
    public string City { get; set; }
    public string Zip { get; set; }
}

コントローラー

[HttpPost]
public ActionResult GetAddress(Address model)
{
    if (!String.IsNullOrEmpty(model.Zip))
    {
        model.City = GetCityByZip(model.Zip);
    }
    return View(model);
}

ビュー

<div class="formrow">
    @Html.LabelFor(model => model.City)
    @Html.TextBoxFor(model => model.City) 
    @Html.ValidationMessageFor(model => model.City)
</div>
<div class="formrow">
    @Html.LabelFor(model => model.Zip)
    @Html.TextBoxFor(model => model.Zip) 
    @Html.ValidationMessageFor(model => model.Zip)
</div>

問題は、都市が変更されているときはいつでも、それがビューに反映されないことです。デバッグ中、model.Cityには正しい値が含まれていますが、表示されません。正しい値@Html.TextBoxFor(model => model.City)を表示しないような単純なものでも。model.City

4

2 に答える 2

48

HtmlHelpers は、モデルを更新して返すときに、モデルではなくモデルの状態からモデル値を取得します。モデルを更新して返すには、post メソッドに次のコード行を追加します。

ModelState.Clear();

または、ModelState 自体に city の値を設定することもできます。

ModelState["City"].Value = GetCityByZip(model.Zip);
于 2012-08-07T02:37:16.230 に答える
3

Tommy が指摘したように、これは直観に反して正しい動作です。なぜなら、post で送信されたフォーム データは、返されたビューにデータをバインドするときに最優先されるからです。ユーザーが同じビューを再度返すときに検証エラーを起こした可能性が高く、ページを復元するときにフォーム入力が失われるという問題なしにフォーム入力を再開できるため、これはある程度理にかなっています。

もう1つのオプションは、入力の値を手動で挿入することです

したがって、これの代わりに:

@Html.TextBoxFor(model => model.City)

代わりにこれを行います

<input type="text" name="City" value="@Model.City" />

*モデルから直接値を取得します

またはさらに良い

<input type="text" value="@Model.City"
       name="@Html.NameFor(model => model.City)"
       id="@Html.IdFor(model => model.City)" />

*注data-val: これは属性を持ち込まない。クライアント側の検証のためにこのプロパティでそれらを使用している場合は、特定の要素のデータ検証属性のリストを作成する必要があります

その他のリソース

于 2020-05-19T15:00:47.223 に答える