2

私はEnitityフレームワードでasp.net MVC3を使用しています。どちらもWCF Webサービスを介して通信しています。

問題は、サーバー側の DB 開発者が [Required]/[Range] 属性をエンティティ クラスのプロパティに設定したくないということです。しかし、mvc3 アプリケーションで最後にフィールドを検証したいと考えています。ここで、WCF Webサービス参照を追加しました。プロキシを生成しました。

クライアント ポリシーに従って Jquery/javascript を使用したくありません。そのため、コントローラー/モデルレベルで行う必要があります。これを管理する方法は?mvc 3 aaplicationから各エンティティのプロパティに必要な属性を動的に追加する必要がある方法。スピードアップするには正しい方向が必要です。

追加するのを忘れました: データベース開発者は厳密にユーザーを回避する必要があります。また、エンティティとマッピングでデータベースが生成されません。

4

4 に答える 4

2

エンティティを検証するコードを作成する必要があります。開発者がエンティティでこれらの属性を使用したとしても、WCF で生成されたプロキシを介して DAL にアクセスしており、これらの属性はツールによって生成されないため、それらの属性はあなたの側にはありません。

サービス参照の追加によって生成されたすべてのクラスは部分的である必要があるため、カスタム部分部分を追加して検証を実装できます (IValidatableObjectインターフェイスを実装することにより)。

于 2011-10-19T09:44:52.263 に答える
2

私は Ladislav Mrnka に同意しますが、エンティティ クラスのプロパティを変更できない場合は、それを入手する必要があります。

[MetadataType(typeof(YourOwnClassForValidation))]
public partial class ClassOfYourDbDeveloper
{
    // db developer doesn't allow you to change this
    public string Title { get; set; }
}

public class YourOwnClassForValidation
{
    // here you can use your data annotations
    // important to use object
    [Required]
    public object Title { get; set; }
}

プロパティを設定するだけです。詳細については、下部にあるhttp://www.asp.net/mvc/tutorials/validation-with-the-data-annotation-validators-csを参照してください。

于 2011-10-19T10:05:54.583 に答える
1

ビュー モデルを使用します。それらの意図された目的の 1 つは、ビューからモデル オブジェクト (MVC の M として) を抽象化することです。

ビュー モデルに検証属性を配置し、マッパー (オートマッパーなど) を使用して、db エンティティとの間で情報をコピーします。

コントローラー アクションで使用ModelState.IsValidして、ビュー モデルが有効かどうかを確認します。

私の POST アクションメソッドは通常、次のように見えます。

[HttpPost]
public virtual ActionResult Edit(EditModel model)
{
    if (!ModelState.IsValid)
        return View(model);

    try
    {
        // fetch db entity
        var template = _templateService.Get(model.Id);

        // copy info from view model to db entity
        Mapper.Map(model, template);

        // save db entity
        templateService.Save(template);

        return RedirectToAction("Details", new { id = template.Id });
    }
    catch (Exception err)
    {
        Logger.Error("Failed to save template", err);
        ModelState.AddModelError("", err);
        return View(model);
    }
}
于 2011-10-19T13:20:37.653 に答える
1

モデルのメタデータ/検証プロバイダーとして使用するクラスを登録できます。

あなたのエンティティを持っている、それは変更できません:

public class MyModel 
{
    public int IntProperty { get; set; }

    public DateTime DateProperty { get; set; }
}

元のクラスであるかのようにメタデータを検証して提供できることを、MVC 側でメタデータを持つことができます。

[ValidationAttribute(...)]
[ValidationAttribute(...)]
public class MyModelValidator
{
    [Required]
    [Display("My Integer")]
    public int IntProperty { get; set; }

    [DataType(DataType.DateTime)]
    public DateTime DateProperty { get; set; }
}

最後に、Metadata/Validator クラスを対応する基本クラス (たとえば、Global.asax) にアタッチするだけです。

protected void Application_Start()
{
    AssociatedMetadataTypeTypeDescriptionProvider typeDescriptionProvider;

    typeDescriptionProvider = new AssociatedMetadataTypeTypeDescriptionProvider(
            typeof(MyModel),
            typeof(MyModelValidator));

    TypeDescriptor.AddProviderTransparent(typeDescriptionProvider, typeof(MyModel));

    // register other metadata classes
}

必要なすべてのエンティティに対してこれを行うことができます。

于 2011-10-19T10:52:30.017 に答える