2012-01-20 13 views
1

具体的なビューであるaspページにテキストボックスがあります。ユーザーは2000文字の文字列を入力します。保存ボタンを押すと、この値がデータベースに保存されます。ページを保存した後、入力した値がラベルとして表示される別のページにリダイレクトされました。私は、テキストボックスの値をセッションに保存していました。 MVPで使用しているときにどのように処理すればよいですか?MVPでのセッション管理 - 簡略化された例

1)TextInputPageのMVP概念を使用してセッションの値を設定するにはどうすればよいですか?

2)MVP概念を使用してセッションから読み込んだ後、結果をラベルに表示するにはどうすればよいですか?

注:セッションに値を追加する前に、処理(テキストが追加されています)があります。

別の投稿を指すのではなく、コードの例で答えることができれば素晴らしいと思います。これは、新しい人が学ぶためのもっとも簡単な例です(私は思う:-))。

using System; 
namespace ViewInterfaces 
{ 
public interface ITextView 
{ 
    string InputtedText { get; } 
    event EventHandler ButtonClickedEvent; 
} 

}

<form id="form1" runat="server"> 
<div> 

    <asp:TextBox ID="txtInput" runat="server"></asp:TextBox> 

&nbsp;<asp:Button ID="btnGoToResult" runat="server" Text="Go To Result" 
     onclick="btnGoToResult_Click" /> 

</div> 
</form> 


using System; 
using ViewInterfaces; 
using Presenter; 
using Model; 

public partial class TextInputPage : System.Web.UI.Page, ITextView 
{ 

public event EventHandler ButtonClickedEvent; 
private TextPresenter listPresenter; 

protected void Page_Load(object sender, EventArgs e) 
{ 
    TextModel modelController = new TextModel(); 
    listPresenter = new TextPresenter(this, modelController); 
    this.listPresenter.OnViewLoaded(); 
} 

public string InputtedText 
{ 
    get 
    { 
     return txtInput.Text; 
    } 
} 


protected void btnGoToResult_Click(object sender, EventArgs e) 
{ 

    if (ButtonClickedEvent != null) 
    { 
     //Riase the event 
     ButtonClickedEvent(this, e); 
    } 


    //Session does not use any MVP now. 
    if (txtInput.Text.Length > 0 && txtInput.Text.Length <= 100) 
    { 
     Session["TextInput"] = "1-100 "+txtInput.Text; 
    } 
    else if (txtInput.Text.Length > 100 && txtInput.Text.Length <= 1000) 
    { 
     Session["TextInput"] = "101-1000" + txtInput.Text; 
    } 
    else 
    { 
     Session["TextInput"] = "1001 - 2000" + txtInput.Text; 
    } 


    //Redircting currenlty does not use any MVP concept 
    Response.Redirect("/SessionTestWebSite/ResultOutputPage.aspx"); 
} 

}

<form id="form1" runat="server"> 
    <div> 

    <asp:Label ID="lblResult" runat="server" Text="Label"></asp:Label> 

</div> 
</form> 

using System; 
public partial class ResultOutputPage : System.Web.UI.Page 
{ 
protected void Page_Load(object sender, EventArgs e) 
{ 
    //Does not use MVP now 
    lblResult.Text = (string) Session["TextInput"]; 
} 

}

using System; 
using ViewInterfaces; 
using Model; 

namespace Presenter 
{ 
public class TextPresenter 
{ 
    private ITextView viewObj; 
    private TextModel contactsModelController; 

    public TextPresenter(ITextView view, TextModel controller) 
    { 
     viewObj = view; 
     contactsModelController = controller; 
    } 

    //Presenter Method 
    public virtual void OnViewLoaded() 
    { 
     //Event subscription 
     viewObj.ButtonClickedEvent += new EventHandler(DetailView_EditClicked); 

    } 

    void DetailView_EditClicked(object sender, EventArgs e) 
    { 
     //Calling Model's Functionality 
     contactsModelController.StoreText(viewObj.InputtedText); 
    } 

} 

}

namespace Model 
{ 
public class TextModel 
{ 
    public void StoreText(string inputString) 
    { 
     //Store to database 
    } 

} 

}

参考文献: mvp session response request

+0

ちょっと質問:ASP.Net MVCパターンに移行するのはなぜですか?このメリットは、コードの学習と変更に対する投資を返済します。 –

+0

私はMVPを最初に学びたいです(:-))Morover、私たちの現在のプロジェクトはMVPを使用しています。契約上の問題のためMVCに変更する可能性はありません。 – Lijo

+0

MVPは多くの摩擦と「セレモニーコード」を持っていますが、MVPパターンはWebアプリケーションに完全に対応しています。さらに、ページが高速に実行され、テスト容易性がはるかに容易になります。 アップグレードパスは、ソリューションにMVCセクションを追加する可能性があります。それはaspxページと並んで動作できます。私はオフトピックになるつもりです:-) –

答えて

0

私は通常、次の方法を使用します。

public interface ITextView 
{ 
    string InputtedText { get; } 
    string SessionTextEntry { get; set; } 
    void RedirectToTestPage(); 

    event EventHandler ButtonClickedEvent; 
} 

View実装:

public partial class TextInputPage : System.Web.UI.Page, ITextView 
{ 
    ... 

    public string SessionTextEntry 
    { 
     get { return (string)Session["TextInput"]; } 
     set { Session["TextInput"] = value; } 
    } 

    public void RedirectToTestPage() 
    { 
     Response.Redirect("/SessionTestWebSite/ResultOutputPage.aspx"); 
    } 

    ... 
} 

プレゼンター:

public class TextPresenter 
{ 
    ... 

    void DetailView_EditClicked(object sender, EventArgs e) 
    { 
     //Calling Model's Functionality 
     contactsModelController.StoreText(viewObj.InputtedText); 

     // Save to session and redirect 
     viewObj.SessionTextEntry = GetTextForSession(viewObj.InputtedText); 
     viewObj.RedirectToTestPage(); 
    } 

    // data processing logic 
    private string GetTextForSession(string inputtedText) 
    { 
     if (inputtedText.Length > 0 && inputtedText.Length <= 100) 
      return "1-100 " + inputtedText; 

     if (inputtedText.Length > 100 && inputtedText.Length <= 1000) 
      return "101-1000" + inputtedText; 

     return "1001 - 2000" + inputtedText; 
    } 

    ... 
} 

この場合、getterを削除できるように、ITextView.SessionTextEntryのセッターのみを使用しました。 希望すると助かります...

+0

入力していただきありがとうございます。私はまだそれを試していない。 – Lijo

関連する問題