0

ASP.NET MVC コントローラーのメソッドを使用して新しく作成したオブジェクトを挿入しようとしている GUID 主キーを持つテーブルがありますUpdateModel(db は LINQ-to-SQL データ コンテキストです)。

    [AcceptVerbs(HttpVerbs.Post)]
    public ActionResult Create(FormCollection collection)
    {
        Fields field = new Fields();
        field.ID = Guid.NewGuid();

        try
        {
            UpdateModel(field);

            db.Fields.InsertOnSubmit(field);
            db.SubmitChanges();

            return RedirectToAction("Index");
        }
        catch
        {
            return View("Edit", field);
        }
    }

まず、モデルの編集および作成用に自動生成されたビューに、ユーザーが編集するための主キー フィールドが含まれているのは奇妙に思えますが、それらを削除するのは簡単です。

しかし、主キーがフォーム コレクションの一部として渡されない場合に、への呼び出しでUpdateModel例外がスローされるという問題が発生しています。

UpdateModel主キー列に、ユーザー (ひいては への呼び出し) がいじってはいけないものとしてフラグを立てる方法がありませんか? 配列を追加してincludeProperties、主キーの名前を除外することもできますが、それはあまり DRY ではありません)。

主キーを組み込んだ非表示フィールドをフォームに追加することもできます。GUID 主キーを使用すると、Create への GET 要求でこれを行うことができます。

4

2 に答える 2

3

モデル オブジェクトを更新UpdateModelしていないときは使用しないでください。この場合、あなたはそれを作成しています... ScottGu は、このブログ投稿にいくつかの良い例を掲載しています。

データバインドをより簡単に行う方法が必要な場合は、適切な命名規則を使用すれば、ASP.NET MVC が自動的に多くの作業を行います。たとえば、入力フィールド「firstName」、「lastName」、および「birthDate」を持つフォームは、次の署名を持つアクション メソッドにデータを送信できます。

public ActionResult Create(string firstName, string lastName, DateTime birthDate)

パラメータにはフォームの値が取り込まれます。データ型は文字列である必要はありません。実際、独自のクラスにバインドすることもできます。このクラスがあれば…

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthdate { get; set; }
}

...入力フィールド「person_FirstName」、「person_LastName」、および「person_BirthDate」を含むフォームは、新しい Person オブジェクトにすぐにバインドできます。

public ActionResult Create(Person person) { ... }

いいですね。=)

于 2009-09-23T23:52:59.100 に答える
0

まず第一に、その場合、主キーを持つプロパティは読み取り専用にする必要があります。

独自の BindModel クラスを使用することもできます。

于 2009-09-23T23:25:22.517 に答える