2012-10-24 83 views
4

我試圖開發一個ASP.NET應用程序「通過本書」;我有我的Web窗體實現MVP模式,我的演示者只會談到服務層,而不是談論一堆共享我自己的EF ObjectContext的存儲庫。到現在爲止還挺好。現在我正在處理前端,我有一個兩難...什麼是收集ASP.NET Web輸入值的建議方式

可以說我有一個名爲txtDateOfBirth的asp:TextBox控件並提交按鈕。當用戶點擊按鈕,我需要發送數據從ASPX到主持人到服務....但問題是,最後我不需要字符串,但日期時間?和我不知道要轉換最好的地方:

  • 我應該把一個驗證的ASPX頁面,然後在後臺代碼做轉換?
  • 或者我應該從表單中收集一堆字符串,爲僅包含字符串的服務創建一個請求,並且讓我的業務模型執行嘗試/轉換和報告錯誤?

你有什麼建議?任何有識之士的讚賞...

編輯: OK,之後已閱讀並嘗試了所有的你的建議,我決定去與以下幾點:

  1. 代碼隱藏和APSX負責數據類型轉換。 I 決定使用簡單的CompareValidator,並檢查 適當的類型,以便代碼隱藏可以肯定地將其轉換。
  2. 從演示者到服務層的請求適當地輸入 。
  3. 所有其他驗證是由業務層實現(包括 字符串長度,需要與否,範圍,...)

回答

1

如果我的理解正確,那麼您的WebForm中有一個文本框,用戶在其中寫入應該是日期的內容,對嗎?

有出頭你可以這樣做:

+0

我不認爲使用Telerik是一種選擇,也不是編寫JavaScript。但是這個第二個選項似乎是我一直在尋找的東西。好的,可以說我建立驗證器,這是很容易的部分。現在的問題是:我的數據註釋是什麼?我真的不喜歡數據註釋我的業務類的想法。註釋來自服務的視圖模型是否有意義並以ASPX形式顯示? –

4

我會說,這是合法的表示層到原始類型轉換成任何業務層想要處理。例如在ASP.NET MVC框架中(我知道你沒有使用它),業務層使用「模型」與視圖層進行通信,這些「模型」是簡單的,特定於業務的.NET對象,用於通信三個MVC圖層。

+0

好的,那是一個好的開始!所以,當我去服務層,我的請求對象將具有適當的類型。現在剩下要做的就是看看如何將字符串轉換爲這些類型...... –

1

1)代碼後面應執行轉換

  • 例如,輸入串(從txtDateOfBirth)爲日期時間或日期時間?

2)業務邏輯應檢查業務規則

  • 例如,用戶必須是16歲以上

3)方法應該是

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

您可以看到.Net Framework主要使用強類型參數而不是字符串和對象。

如果您不想傳遞可爲空的值,則可以使用以下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 
    } 
} 
+0

很好的答案。我認爲可以通過顯示用於服務器端驗證的代碼隱藏模式(使用tryparse?)並以某種方式將驗證錯誤傳遞迴頁面來幫助它(例如,是否可以從服務器端向ValidationSummary提供驗證錯誤? ) – pseudocoder

+0

除了業務邏輯的偏差之外,我仍然更喜歡使用RequiredFieldValidators和其他客戶端驗證器。再次,這只是個人偏好。如果您在驗證過程中遇到問題,請創建一張新票,以便對其他人有所幫助。 – Win

相關問題