-1

MVC パターンの winforms を使用して DB にレコードを追加したいと考えています。DBにレコードを追加する機能は動いているのですが、オブジェクトメソッドで行いたいです。

MVCパターンでここでやっている間違いは何ですか?

意見:

        using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Windows.Forms;
using MVCwithDBFormReg.Controller;
using MVCwithDBFormReg.Model;

namespace MVCwithDBFormReg.View
{
    public partial class Form1 : Form, IUserView
    {

        private readonly User _model;
        public Form1(User model)
        {
            _model = model;
            InitializeComponent();
        }


        public event CreateUserHandler Create;

        private void button3_Click(object sender, System.EventArgs e)
    {
        _model.FirstName = FirstName;
        _model.LastName = LastName;
        _model.Language = Language;
        _model.Country = Country;
        _model.State = State;
        _model.Zipcode = Zipcode;
        _model.TimeZone = TimeZone;
        _model.Sex = Sex;
        _model.Month = Month;
        _model.Day = Day;
        _model.Year = Year;
        _model.Occupation = Occupation;

        Create(_model);

    }

    }
}

モデル:

         namespace MVCwithDBFormReg.Model
{
    public class User
    {

        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string Language{ get; set; }
        public string Country{ get; set; }
        public string State{ get; set; }
        public int Zipcode { get; set; }
        public string  TimeZone{ get; set; }
        public Gender Sex { get; set; }
        public enum Gender
         {
            Male = 1,
            Female = 2

         }
         public string Month { get; set; }
         public string Day { get; set; }
         public int Year { get; set; }
         public string Occupation { get; set; }


    }

コントローラ:

     namespace MVCwithDBFormReg.Controller
{
   public class UserController
   {


       private SqlConnection sqlConnection1;
       private void ViewOnSave(User model)
       {
           if (model.FirstName == "" || model.LastName == "")
               MessageBox.Show("Please enter your name");
           else
           {
               sqlConnection1.Open();

               string insert = "INSERT INTO REGISTER(FNAME, LNAME, LANG, COUNTRY, STATE, ZIPCODE, TIMEZONE, GENDER, BDAY, BMONTH, BYEAR, OCCUPATION) " +
                               "VALUES ('" + model.FirstName + "','" + model.LastName + "','"
                               + model.Language + "','" + model.Country + "','"
                               + model.State + "','" + model.Zipcode
                               + "','" + model.TimeZone + "','"
                               + model.Sex + "','" + model.Day + "','"
                               + model.Month + "','" + model.Year + "','"
                               + model.Occupation + "')";
               SqlCommand cmd = new SqlCommand(insert, this.sqlConnection1);
               cmd.ExecuteNonQuery();

               sqlConnection1.Close();
               MessageBox.Show("You have been successfully registered to our database.");
           }
       }
   }
}
4

1 に答える 1

4

技術的には完全にMVCではありません(WinFormsプロジェクトでMVCに大きな意味があるとは思えませんが、MVVMパターンはそれ自体がより有用であることが証明されています.MVCが意味をなす特別なケースがあるため、私は間違っているかもしれません).

まず、モデル クラスは UserRegister ではなく、User です。第 2 に、コントローラーで保存できるため、UserRegister クラスは必ずしも必要ではありません (実際には良い方法ではありませんが、トレーニング目的には十分単純です)。または、データベース アクションをコントローラー コードから本当に分離したい場合は、Repository パターンのような便利なものを使用できます (1 つの Repository クラスの UserRegister、UserLoad、UserFind クラスのようなものです)。建築とデザインに関する Martin Fowler の本 (または単にインターネットのチュートリアル) を読むことをお勧めします。

これで、モデル (純粋なデータ) - ユーザーが何であるかを理解できました。ビューにはロジック (データを DB に保存したり、テディベアの割引を計算したりするなど) を含める必要はありません。ビューのみです。ビューはモデルにバインドされています。つまり、モデルの内容を表示し、コントロールを介してモデルのプロパティを設定します。同様に、ユーザー名のテキストボックスがあり、Model.Name からのデータが表示され、変更されるたびに Model.Name が設定されます。

Saveボタンがクリックされるたびに、ビューはコントローラーに変更されたモデルを送信して、それに基づいて動作できるようにします。コントローラーは、ビューから取得したユーザーを保存するように UserRegister に要求するなど、物事をつなぎ合わせます。ところで、ここではイベントは必要ありませんが、使用できます。

上記のすべてをサポートする方法で変更されたコードを表示しようとします。

意見:

private readonly User _model;
public Form1(User model)
{
    _model = model;
    InitializeComponent();
}

public event CreateUserHandler Create; // should be changed to use User 
//Function to create a new record into the DB
private void btnSave_click(object sender, System.EventArgs e)
{
    // if model is not bound via binding, it needs update before Create.
    Create(_model); // needs changes to current EventHandler
}

モデル - 変更なし。UserRegister - 死にます。

どこか (Delegates.cs の別のファイルのように):

public delegate void CreateUserHandler(User model);

コントローラ:

public UserController(IUserView view)
{
    _view = view;
    _view.Create += ViewOnSave;
}

private void ViewOnSave(User model)
{
    SqlConnection connection = new SqlConnection(connString);
    connection.Open();
    //... save query goes here
}

ここではリポジトリは使用されないことに注意してください。とにかく、この MVC はまだ不完全でバグがあります。ASP.NET MVC のチュートリアルを読んで、.NET 環境で MVC パターンを理解することをお勧めします。

于 2012-08-18T15:57:34.733 に答える