1

私の見解では、私は次のコードを持っています:

@using (Html.BeginForm()) {
  @Html.TextBox("Date2", Model.Date2)
  <br/>
  @Model.Date2
  <input type="submit" value="Create" />
}

私のコントローラーには:

    [HttpPost]
    public ActionResult Index(Home home){
        ViewBag.Message = "Welcome to ASP.NET MVC! (after a submit)";
        home.Date2 = home.Date2.AddDays(1);
        return View("Index", home);
    }

モデルは次のとおりです。

public class Home {
    public DateTime Date2 { get; set; }
}

私の質問は次のとおりです。送信ボタンを押すと、TextBoxの表示よりも、1日多い日付ではなく、日付を直接出力するhtmlが表示されるのはなぜですか。

編集:

MVC3ソースコードにステップインprivate static MvcHtmlString InputHelper(...)すると、適切な日付の値パラメーターを取得していることがわかりますが、後でコードはから古い値を取得しattemptedValueます...ここでデバッグを確認できますhttp://i.stack.imgur.com/x2mTI .png

4

3 に答える 3

1

私は同じ問題に遭遇しました...それは、アクションから返されるプロパティと同じ名前を持つが、異なる値を持つプロパティがアクションに渡されることに関係しています。

なぜそれが起こっているのか答えることはできませんが、それを修正する方法についての解決策を提供することはできます(同じモデルを受け入れて返すので、おそらくあなたの場合はそうではありません)。

public Action(IncomingViewModel incomingViewModel)
{
    var viewModel = new ViewModel();
    //incoming Date has different name than outgoing date
    viewModel.Date2 = incomingViewModel.OldDate2;
    return viewModel;
}

私が言ったように、これはあなたの場合の一種のハックです(私の場合、それはそれほど大きくはありませんでした)。繰り返しになりますが、それはあなたの問題を解決しませんが、あなたを解決に近づけるかもしれません。

于 2012-04-09T17:58:07.263 に答える
1

これは、ポストアクションからビューを返すときに、すべてのMVCヘルパーメソッド(Html.Textbox、Html.DropdownListなど)が、実際のオブジェクトの値ではなく、ポストされた値を使用して要素をレンダリングするためです。

これにより、検証エラーのあるビューが返されます。たとえば、アクションで変更される可能性のある他の値ではなく、ユーザーの入力を正確にレンダリングします。

于 2012-04-09T18:06:11.507 に答える
1

ModelState入力された値のコピーをフォームフィールドに保存します。通常、POSTアクションでフォームを表示している場合は、検証が失敗したためです。そのため、新しい値ではなく、「試行された」値の入力を再表示する必要があります(これは入力HTMLヘルパーがデフォルトで行うことです)。

試行された値を使用しないようにするには、ModelStateから削除します。例:

    [HttpPost]
    public ActionResult Index(Home home)
    {
        ViewBag.Message = "Welcome to ASP.NET MVC! (after a submit)";
        ModelState.Remove("Date2");
        home.Date2 = home.Date2.AddDays(1);
        return View("Index", home);
    }
于 2012-04-09T18:07:45.723 に答える