2011-01-07 15 views

答えて

25

はい、あります?それが呼ばれています? 。。ビューモデルビューモデルは

特に特定のビューの特定のニーズに合わせたクラスであるので、代わりの:

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

使用:

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

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

+2

+1これは、私がViewModelとビジネスモデルについて見たことのある最も良い記述です。私はセキュリティの観点から考えたことはありません。しかし、httpは少なくともビューモデルを使用する**理由です。 – jgauffin

+0

私は更新用の個別のビューモデルとシナリオを作成する必要がありますか? – Rookian

+1

@Rookian、はい、別々のビューモデルを持つことをお勧めします。 –

10

私が理解した非常に簡単な解決策です。

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

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

デズモンドが述べたように、私は私が無視される複数の小道具のために便利になることができ、簡単な拡張を行ったまた、非常に使いやすい削除見つける...

/// <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("ID", "Prop2", "Prop3", "Etc"); 
6

、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) 
+0

は、私はこの答えを好むが、私はまだあなたが[のviewmodels](http://stackoverflow.com/questions/11064316/what-is-viewmodel-in-mvc)を使用する必要があると考えていると、[POCOさん](のhttp://のstackoverflow。デザインパターンと[SoC](http://stackoverflow.com/questions/98734/what-is-separation-of-concerns)に関しては、com/questions/250001/poco-definition)があります。 –

0

あなたはASP.NETのコアを使用している場合は、属性とプロパティを飾ることができます。

[BindNever] 
関連する問題