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

[解決済み] datetime2 データ型から datetime データ型への変換で、範囲外の値が発生しました。

2022-04-15 23:30:10

質問

HomeControllerに以下のようなコードを書いています。

public ActionResult Edit(int id)
{
    var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
    return View(ArticleToEdit);
}

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
    var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
    if (!ModelState.IsValid)
        return View(originalArticle);

    _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
    _db.SaveChanges();
    return RedirectToAction("Index");
}

そして、これがEditメソッド用のビューです。

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="headline">Headline</label>
            <%= Html.TextBox("headline") %>
        </p>
        <p>
            <label for="story">Story <span>( HTML Allowed )</span></label>
            <%= Html.TextArea("story") %>
        </p>
        <p>
            <label for="image">Image URL</label>
            <%= Html.TextBox("image") %>
        </p>
        <p>
            <input type="submit" value="Post" />
        </p>
    </fieldset>

<% } %>

送信ボタンを押すと、エラーが発生します。 {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."} 何が問題なのか、何か思い当たることはありますか?編集メソッドがDBに投稿された値を編集されたものに更新しようとしているのだと思いますが、なぜかそれが気に入らないようです...。しかし、editのコントローラメソッドには日付は書かれていないので、なぜ日付が関係しているのかわかりません?

どうすればいいですか?

この問題は、あなたが ApplyPropertyChanges を、フォームのデータ (見出し、ストーリー、画像) のみが入力されたモデルオブジェクトと組み合わせて使用します。 ApplyPropertyChanges は、オブジェクトのすべてのプロパティに変更を適用し、初期化されていない DateTime の範囲外である0001-01-01に設定されています。 DATETIME .

を使用するのではなく ApplyPropertyChanges この方法では、変更されたフィールドのみが修正されます。 この方法では、変更されたフィールドのみが変更されます。別の方法として、他のフィールドが入力されるようにページに隠された入力を配置することもできますが、これは同時編集に対してあまり親切ではありません。

更新してください。

以下は、オブジェクトのいくつかのフィールドを更新するだけの未試験のサンプルです(これはLINQ to SQLを使用していると仮定しています)。

var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId);
story.headline = ArticleToEdit.headline;
story.story = ArticleToEdit.story;
story.image = ArticleToEdit.image;
story.modifiedDate = DateTime.Now;
_db.SubmitChanges();