-1

我想使用 MVC 模式 winforms 将记录添加到数据库中。将记录添加到数据库中的功能正在工作,但我想通过使用对象方法来完成。

有人请我在这里用 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(我怀疑 MVC 在 WinForms 项目中是否有很多意义,MVVM 模式已经证明它自己更有用。虽然我可能错了,因为在某些特殊情况下 MVC 是有意义的)。

首先,您的模型类不是 UserRegister,而是 User。其次,您不一定需要 UserRegister 类,因为您可以在控制器中保存(这不是一个很好的做法,但对于培训目的来说足够简单)。或者,如果您真的想将数据库操作与控制器代码分开,您可以使用类似 Repository 模式的便利(就像一个 Repository 类中的 UserRegister、UserLoad、UserFind 类)。我建议阅读一些关于建筑和设计的 Martin Fowler 书籍(或只是互联网教程)。

现在我们已经了解您的模型是什么(纯数据) - 用户。您的视图不应该有任何逻辑(例如将数据保存到数据库或计算泰迪熊的折扣) - 只有视图。视图绑定到模型,这意味着它显示模型有什么,并通过控件设置模型的属性。就像 - 您有一个用户名文本框,它显示来自 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 回答