web-dev-qa-db-ja.com

ASP.NET MVC-[Bind(Exclude = "Id")]の代替

[Bind(Exclude = "Id")]関連する質問) の代替手段はありますか?

モデルバインダーを書いてもらえますか?

20
Rookian

はい、あります。ビューモデルと呼ばれます。ビューモデルは、特定のビューの特定のニーズに合わせて特別に調整されたクラスです。

したがって、代わりに:

public ActionResult Index([Bind(Exclude = "Id")] SomeDomainModel model)

使用する:

public ActionResult Index(SomeViewModel viewModel)

ここで、ビューモデルには、バインドする必要のあるプロパティのみが含まれています。次に、ビューモデルとモデルの間でマッピングできます。このマッピングは AutoMapper で簡略化できます。

ベストプラクティスとして、ビューとの間で常にビューモデルを使用することをお勧めします。

32
Darin Dimitrov

私が考え出した非常に単純な解決策。

public ActionResult Edit(Person person)
{
    ModelState.Remove("Id"); // This will remove the key 

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}
13
Desmond

;を使用して、属性を使用してプロパティを直接除外できます。

[BindNever]
12
PaulB

既存の回答に加えて、C#6を使用すると、より安全な方法でプロパティを除外できます。

public ActionResult Edit(Person person)
{
    ModelState.Remove(nameof(Person.Id));

    if (ModelState.IsValid)
       {
           //Save Changes;
       }
    }
}

または

public ActionResult Index([Bind(Exclude = nameof(SomeDomainModel.Id))] SomeDomainModel model)
6
Memet Olsen

Desmondが述べたように、削除は非常に使いやすく、複数の小道具を無視するのに便利な簡単な拡張機能も作成しました...

    /// <summary>
    /// Excludes the list of model properties from model validation.
    /// </summary>
    /// <param name="ModelState">The model state dictionary which holds the state of model data being interpreted.</param>
    /// <param name="modelProperties">A string array of delimited string property names of the model to be excluded from the model state validation.</param>
    public static void Remove(this ModelStateDictionary ModelState, params string[] modelProperties)
    {
        foreach (var prop in modelProperties)
            ModelState.Remove(prop);
    }

アクションメソッドでは、次のように使用できます。

    ModelState.Remove(nameof(obj.ID), nameof(obj.Prop2), nameof(obj.Prop3), nameof(obj.Etc));
3
Vedran Mandić