質問

私はTryUpdateModelを使用して、asp.NET MVC 2 RC2の私のモデルに検証を追加するDataAnnotationsを使用しようとしている。

        var user = UserManager.Find(id);

        this.TryUpdateModel<IProvisioningObject>(user, form.ToValueProvider());

このモデルを更新しますが、検証が呼び出されることはありません。私は無駄に、(検証メタデータを有する)を直接ProvisioningObjectを使用して、フォームの値プロバイダを使用しない、(ユーザの直下型である)、ならびにTryUpdateModelを使用してみました。

例については、グーグルで私だけのパラメータ

を通じて結合することによってDataAnnotationsを使用する方法を提供します
public ActionResult Update(User user)

どの私は更新のシナリオのために嫌います。

任意のヒントおよび/またはソリューション?

編集 私のオブジェクトは、WCFサービスから自動生成されたオブジェクトです。

私は、パーシャルはDataAnnotationsを追加できるようになりました。 それは明らかに私もDataAnnotationsと私の問題だと思うの継承をサポートしていないので、私はTryUpdateModelを3回呼び出します。私はProvisioningObjectの検証属性を指定し、そのような継承されたものを探していませんバインディングます。

[MetadataType(typeof(ProvisioningObjectMetadata))]
public partial class ProvisioningObject : IProvisioningObject
{
    public string DisplayNameInvariant { get { return string.IsNullOrEmpty(this.DisplayName) ? this.Name : this.DisplayName; } }
}


[MetadataType(typeof(UserMetadata))]
public partial class User : IUser
{
}


public class ProvisioningObjectMetadata
{
    [DisplayName("Country")]
    public string CountryIsoCode { get; set; }

    [Required(ErrorMessageResourceType = typeof(Properties.Validation), ErrorMessageResourceName = "DisplayNameIsRequired")]
    [TempValidator]
    public string DisplayName { get; set; }
}


public class UserMetadata
{
    [DisplayName("Username")]
    public string Name { get; set; }
}


// Controller action
    public ActionResult Update(string id, FormCollection form)
    {
        var user = UserManager.Find(id);

        this.TryUpdateModel<IUser>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IPerson>(user.User, form.ToValueProvider());
        this.TryUpdateModel<IProvisioningObject>(user.User, form.ToValueProvider());

        if (ModelState.IsValid) // always true
        {
            return Redirect;
        }
        else
        {
            return View();
        }
    }
私はUserMetadataでのDisplayNameのメタデータを追加する場合は、

、期待どおりに動作しますが、それは何のために非常に冗長なようです。そして、それは私もTryUpdateModelが適切に動作するように、すべての私の継承されたインタフェースをコピー/ペーストしなければならない意味します。

私は私が継承されたクラスに私の検証属性をコピーして貼り付けるために私を必要としない方法を探していと思います。

役に立ちましたか?

解決

新規回答:

「私のオブジェクトは、WCFサービスから自動生成されたオブジェクトである。」

自動生成されたオブジェクトは、それらの任意の属性を持ちません。あなたは、サーバー側またはクライアント側で、あなたのオブジェクトとその属性を定義していますか?

旧回答: あなたのメタデータがIProvisioningObjectでない場合、検証は呼ばれません。 MVC2のデフォルトのモデルバインダーは、唯一の「余分な」[たmetadataType(buddyClass)]検証情報を見つける方法を知っています。

更新シナリオでは、あなたのメインのモデルクラスに)は、IsValid(場合、のDTOをマッピング、その後のDTOに対してバインドします。

他のヒント

あなたの部分クラスでIDataErrorInfoインターフェイスを実装 あなたは(あなたが必要な各プロパティを検証するために、データの注釈クラスを使用することができます)各フィールドのカスタム検証を記述する必要があります。

あなたはコード例が必要な場合、私に知らせてください。私はあなたのためにそれを書きます!

ソース:ます。http:// www.asp.net/(S(pdfrohu0ajmwt445fanvj2r3))/learn/mvc/tutorial-37-cs.aspxする

How do you know that the validation is not being called? Are you checking ModelState.IsValid in your update controller and finding that it is erroneously coming back true?

A typical update pattern is:

UpdateModel(model);
if(!ModelState.IsValid) return View(model);
return RedirectToAction("Index");

If you are expecting some "IsValid" on your model to automatically be called, that will not happen. The data annotations work behind the scenes with the ModelState dictionary on the Controller base class.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top