72

これは、Asp.Net MVC 2 でスタイルの作成アクションを使用してエンティティを作成しようとすると発生します。

POCO には次のプロパティがあります。

public int Id {get;set;}

[Required]
public string Message {get; set}

エンティティの作成時に Id が自動的に設定されるため、Create アクションでは必要ありません。

ModelState は「Id フィールドが必要です」と言っていますが、そのように設定していません。ここで自動的に何かが起こっていますか?

編集 - 明らかにされた理由

この問題の理由については、Brad Wilson が Paul Speranza 経由で回答しています。

ID の値を提供していますが、自分が存在していることを知りませんでした。これはデフォルト ルート ("{controller}/{action}/{id}") のルート データにあり、そのデフォルト値は空の文字列であり、int には無効です。ID を除外するには、アクション パラメーターで [Bind] 属性を使用します。私のデフォルトのルートは次のとおりです: new { controller = "Customer", action = "Edit", id = " " } // パラメータのデフォルト

編集 - モデルの更新テクニック

TryUpdateModel とそれに関連付けられた除外パラメーター配列を使用して、実際にこれを行う方法を変更しました。

    [HttpPost]
    public ActionResult Add(Venue collection)
    {
        Venue venue = new Venue();
        if (TryUpdateModel(venue, null, null, new[] { "Id" }))
        {
            _service.Add(venue);
            return RedirectToAction("Index", "Manage");
        }
        return View(collection);
    }
4

16 に答える 16

90

次の属性を追加できます。

 [Bind(Exclude = "Id")] 

クラスではなくメソッドのパラメーターで、作成時にそれを除外でき、編集時には引き続き必須になります。

public ActionResult Create([Bind(Exclude = "Id")] User u)
{
    // will exclude for create
}

public ActionResult Edit(User u)
{
    // will require for edit
}
于 2010-01-27T04:45:20.920 に答える
18

「オブジェクト」をリストに動的に追加するフォームでこの問題に遭遇しました。したがって、ユーザーは追加、削除、または更新できました。新しいアイテムが作成された場合を除いて、すべてうまくいきました。このため、私の場合、Id プロパティを除外することはオプションではありませんでした解決策は、ID を Nullable にすることでした:

public int? Id { get; set; }

このように、既存のアイテムには値があり、新しいアイテムには代わりに null があります。いい物。

于 2012-11-15T04:30:09.477 に答える
11

素晴らしい質疑応答で、私の... 後ろを救ってくれました。ただし、何かを追加する必要があります。

それ以外の

[Bind(Exclude = "Id")]

使ったほうがいいと思います

[Bind(Include = "Prop1, Prop2, Prop3, etc")]

..ここで、Prop1、 Prop2、および Prop3 は、アクション レベルでバインドする唯一のプロパティです。

これは、ブラックリストではなくホワイトリストであるためです。ホワイトリストは、より安全で優れています。このようにして、過剰な投稿と不足した投稿のリスクも解決します。Brad Wilson の投稿を参照してください。

于 2010-06-14T21:37:53.883 に答える
7
[Bind(Exclude = "Id")]
public class Hebe
{
      public int Id {get;set;}

      [Required]
      public string Message {get; set}
}

上記の方法では、作成時にモデルの Id プロパティをバインドしません

于 2010-01-26T23:09:29.420 に答える
7

Id はクライアントから 0 として送信される必要があります。モデルには Id=0 で問題はありません。これは int のデフォルトです。問題は、クライアントからの値が表示されないか、スペースまたは null が含まれていることです。Id (または複雑なオブジェクト NestedPropertyId/NestedProperty.Id) を表す入力が非表示になっているため、値がゼロで始まることを確認します。

<input type="hidden" id="id" value="0" />
<input type="hidden" id="eventId" value="0"/>
<input type="hidden" id="contactId" value="0"/>

また、クライアント側で新しいエンティティを追加するためにフォームをリセットするときは、非表示をゼロで初期化するようにします。

これが誰かに役立つことを願っています。

エフィ

于 2015-12-31T18:00:41.710 に答える
2

追加 ?整数に

[Key]
[HiddenInput(DisplayValue = false)]
public int? ID { get; set; }
于 2012-02-17T21:58:56.140 に答える
2

POCOでRC2を使用すると、同じ問題が発生します。プロパティに Id という名前を付けて検証属性を付けていない場合、IsValid はそれが必要であると言います。プロパティに Id 以外の名前を付けると、これは起こりません。Id を除外する必要があるのはなぜですか?

ありがとう

于 2010-01-28T17:00:40.470 に答える
2

ビューをチェックインします。id フィールドに hiddenfield がある場合は削除します。これは編集のみに使用されます。@Html.HiddenFor(Model => Model.Id)

于 2016-02-01T05:21:26.780 に答える
1

新しいMVC2プロジェクトを作成し、単純なPOCOと、コントローラーおよびビューを追加しました。私が理解していることから、あなたはモデルバインディングを使用してオブジェクトを作成しています。

using System.ComponentModel.DataAnnotations;
public class SimpleObject
{
    public int Id {get;set;}
    [Required]
    public string Message { get; set; }
}

コントローラーには

[HttpPost]
public ActionResult Create(SimpleObject created)
{
    /// do something
}

ビューには、IDフィールドのエディターはありませんか?

これがエラーメッセージに表示されることはありません。代わりに、Idは0であるdefault(int)に設定されることになっています。これは私にとってはうまくいきます。どのバージョンのMVC2を使用していますか(私が想定しているRC)?

誤解しないでください。攻撃者がオブジェクトのIDを改ざんする可能性があるため、IDがモデルバインダーによってバインドされないようにすることが重要です。それでも、デフォルトのモデルバインダーは、説明した動作を表示しないはずです。

于 2010-01-27T07:31:13.900 に答える
1

私の場合、問題は ID が type であるという事実から来ていましたstring。(null不可)に変更すると、int修正されました。このstring型は、不適切に設計されたデータベースをリバース エンジニアリングした結果です。

于 2013-05-08T14:42:28.093 に答える
0

モデルに3つの整数フィールドがあることを除いて、同じ問題が発生しました。null許容型のintに誤って必要とされたすべての整数プロパティを設定することで、なんとか回避できました。

于 2010-02-01T14:14:07.780 に答える
0

私は同じ問題を抱えていましたが、Create メソッドの GET 呼び出し中にビュー モデルの空のインスタンスをビューに渡すだけで問題を解決できました。

//GET: DocumentTypes/{Controller}/Create
    public ActionResult Create()
    {
        return View(new DocumentTypeViewModel());
    }

    //POST: DocumentTypes/{Controller}/Create
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(DocumentTypeViewModel viewModel)
    {
        if(ModelState.IsValid) {

            var result = AddDocumentType(viewModel);
            if(!result.HasValidationErrors) {
                return RedirectToAction("Index");
            }

            ModelState.Update(result);

        }

        return View(viewModel);
    }

そして、私の見解では、私は私が持っていることを保証します

@Html.HiddenFor(m => m.ID)

この方法では、バインド属性を明示的に指定する必要はありません

于 2015-06-08T17:36:34.250 に答える