4

私は「本によって」ASP.NETアプリケーションを開発しようとしています。WebフォームにMVPパターンを実装させています。プレゼンターは、サービスレイヤーとのみ通信します。サービスレイヤーは、すべてが独自のEFObjectContextを共有する多数のリポジトリと通信します。ここまでは順調ですね。今、私はフロントエンドに取り組んでおり、ジレンマがあります...

txtDateOfBirthという名前のasp:TextBoxコントロールがあり、送信ボタンがあるとします。ユーザーがボタンをクリックすると、ASPXからプレゼンター、サービス、...にデータを送信する必要がありますが、問題は、最終的に文字列は必要ないが、DateTimeは必要ないということです。変換を行うのに最適な場所がわかりません

  • バリデーターをASPXページに配置してから、コードビハインドに変換する必要がありますか?
  • または、フォームから一連の文字列を収集し、文字列のみを含むサービスのリクエストを作成して、ビジネスモデルに試行/変換してエラーを報告させる必要がありますか?

おすすめは何ですか?どんな洞察も大歓迎です...

編集: OK、あなたの提案をすべて読んで試した後、私は次のことをすることにしました:

  1. コードビハインドとAPSXは、データ型の変換を担当します。単純なCompareValidatorを使用して適切なタイプを確認し、コードビハインドで確実に変換できるようにすることにしました。
  2. プレゼンターからサービスレイヤーに送信されるリクエストは適切に入力されます。
  3. 他のすべての検証はビジネスレイヤーによって実行されています(文字列の長さ、必須かどうか、範囲などを含む)
4

3 に答える 3

4

プレゼンテーション層がプリミティブ型をビジネス層が処理したいものに変換することは正当であると言えます。

たとえば、ASP.NET MVCフレームワーク(使用していないことはわかっています)では、ビジネスレイヤーは、3つのMVCレイヤーとの通信用に設計されたシンプルなビジネス固有の.NETオブジェクトである「モデル」を使用してビューレイヤーと通信します。

于 2012-10-24T13:31:40.377 に答える
1

私がそれを正しく理解していれば、Webフォームに、ユーザーが日付となるはずの何かを書き込むテキストボックスがありますよね?

あなたができることがあります:

  • 日付形式に合わせてフォーマットされたテキストボックスのマスクを使用できます。これにより、日付のような文字列が返されます(後で確認してください)。asp:textboxにはこのオプションがあると思います。とにかく、MaskedEditコントロールにもそれがあります:http ://www.asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/MaskedEdit/MaskedEdit.aspx
  • モデルクラスを使用してから、そのモデルのフィールドのカスタム決定に従って入力を検証できます。ここを参照してください:ASP.NET WEBFORMビジネスオブジェクトクラスでMVCのデータ注釈を使用することは可能ですか?
  • Webフォームを返送する前に、WebフォームのJavascriptを使用して検証できます。とにかく、それはちょっと厄介です。
  • または、コードビハインドでそれを検証し、どこかにエラーメッセージが表示されて問題が発生した場合は、ページをリロードすることもできます。これは、DataAnnotationsがMVCで自動的に行うことです。
于 2012-10-24T13:37:00.893 に答える
1

1)コードビハインドは変換を行う必要があります

  • たとえば、(txtDateOfBirthからの)文字列をDateTimeまたはDateTimeに入力しますか?

2)ビジネスロジックはビジネスルールをチェックする必要があります

  • たとえば、ユーザーは16歳以上である必要があります

3)方法は

  • InsertUser(User user) {}また
  • InsertUser(string firstName, string lastName, DateTime or DateTime? dateOfBirth) {}

.Net Frameworkは、文字列やオブジェクトではなく、主に強い型のパラメーターを使用していることがわかります。

null許容値を渡したくない場合は、 DotNetNukeで使用されている次のアプローチを使用できます。

public class Null
{    
    public static int NullInteger
    {
        get { return -1; }
    }    

    public static decimal NullDecimal
    {
        get { return decimal.MinValue; }
    }

    public static DateTime NullDate
    {
        get { return DateTime.MinValue; }
    }

    ...
}

編集済み-ご要望に応じて、コードビハインドコードを追加しました。これは実際にはパターンではありません。それはただの人の好みです。

public string FirstName
{
  get { return FirstNameTextBox.Text; }
}

public string LastName
{
  get { return LastNameTextBox.Text; }
}

public DateTime DateOfBirth
{
  get
  {
    DateTime d;
    return DateTime.TryParse(DateOfBirthTextBox.Text, out d) ? 
      d : Null.NullDate;
  }
}

protected void SaveButton_Click(object sender, EventArgs e)
{
  try
  {
    var user = new Users()
    {
      FirstName = this.FirstName,
      LastName = this.LastName,
      DateOfBirth = this.DateOfBirth
    };
    UserService.InsertUser(user);
    ... 
  }
  Catch (Exception ex)
  {
    // Log error
  }
}
于 2012-10-24T14:15:17.593 に答える