用于前端数据库访问的 Orchard 小部件

Orchard Widget for front end DB Access

我是 Orchard 开发、C# 和 MVC 的新手,如果这真的很简单,请原谅我...

我在我的职业中使用了 Orchard CMS,所以我了解小部件、图层区域、内容部分等...但是,我给自己的任务是改进一个非常常见的流程,我决定最好的方法是为此目的创建一个模块。

使用小部件的过程的基本概要如下:

  1. 客户导航到一个页面并看到三个部分,提交和查看
  2. "submit" 部分是一个小部件,它是一种表单(很可能是自定义表单),它发布到控制器,并将该数据提交到数据库,我想我有这个想通了..但为了确保我要使用类似下面的东西来做到这一点:

        [HttpPost]
    public ActionResult Index(string fName, string lName) {
        // var post values
        string fName = Request.Form["fName"];
        string lName = Request.Form["lName"];
    
        System.Data.SqlClient.SqlConnection sqlConnection1 =
            new System.Data.SqlClient.SqlConnection(@"[CONNECTION STRING]");
    
        System.Data.SqlClient.SqlCommand cmd = new System.Data.SqlClient.SqlCommand();
        cmd.CommandType = System.Data.CommandType.Text;
        cmd.CommandText = "INSERT INTO Persons (FirstName, LastName) VALUES ('" + fName + "','" + lName +"')";
        cmd.Connection = sqlConnection1;
    
        sqlConnection1.Open();
        cmd.ExecuteNonQuery();
        sqlConnection1.Close();
    
        return View();
    }
    

但是,我不确定这是否是正确的方法,而且我确信有一些更好的方法可以做到这一点,教程建议我使用 contentParts 和 contentPart 记录将数据提交到db 但是,这仅在从管理员端提交数据时才有用,这必须能够由最终用户从前端提交

  1. 第二部分是 table,它将从数据库中获取记录列表并将它们显示给用户,但是,为此我完全不知道如何去做,任何人都可以指向教程、示例源代码,甚至是实现此目的的代码片段?

值得注意的是,我已经阅读了 Orchard 网站上创建模块和小部件的文档,但是,它们都是通过后端更新数据库...

对于遇到此问题寻求帮助的任何人 post,我按照以下方式完成了列出的两件事:

控制器:

 [Themed]
    public class PortingController : Controller
    {
        // GET Porting/Index
        public ActionResult Index()
        {
            List<port> ports = new List<port>();
            string constr = "Data Source=127.0.0.1;Port=3307;Database=orchard;User Id=root;Password=usbw ";
            using (MySqlConnection con = new MySqlConnection(constr))
            {
                string query = "SELECT * FROM icc_porting_icc_activesoftswitch_ports";
                using (MySqlCommand cmd = new MySqlCommand(query)) 
                {
                    cmd.Connection = con;
                    con.Open();
                    using (MySqlDataReader sdr = cmd.ExecuteReader()) {
                        while (sdr.Read()) 
                        {
                            ports.Add(new port {
                                Id = Convert.ToInt32(sdr["Id"]),
                                MBN = sdr["MBN"].ToString(),
                                Partner = sdr["Partner"].ToString()
                            });
                        }
                    }
                }
                con.Close();
            }
            return View(ports);
        }

        // POST AddRequest
        [HttpPost]
        public ActionResult AddRequest(FormCollection forms)
        {
            // init vars
            string mbn = forms["PortingRequestForm.mbn.Value"];
            string partner = forms["PortingRequestForm.Partner.Value"];

            // db con string
            string connString = "Data Source=127.0.0.1;Port=3307;Database=orchard;User Id=root;Password=usbw ";
            MySqlConnection conn = new MySqlConnection(connString);
            conn.Open();
            MySqlCommand comm = conn.CreateCommand();
            comm.CommandText = "INSERT INTO icc_porting_icc_activesoftswitch_ports(mbn, partner) VALUES(?mbn, ?partner)";
            comm.Parameters.AddWithValue("?mbn", mbn);
            comm.Parameters.AddWithValue("?partner", partner);
            comm.ExecuteNonQuery();
            conn.Close();

            //string endContent = mbn + " " + partner;
            return RedirectToAction("Index");
        }
    }
}

然后模型只是简单地声明一些基本属性

为了添加到数据库,我创建了一个自定义表单并使用 jQuery 来更改表单操作,因此没有使用 orchard 的自定义表单控制器,而是 posted 到以下内容:~/{moduleName }/{控制器}/{动作}

然后只需使用标准剃刀标记从索引控制器示例中获取变量:

@using Porting.Models
@model IEnumerable<port>
    <table class="demo">
        <thead>
            <tr>
                <th>ID</th>
                <th>MBN</th>
                <th>Status</th>
            </tr>
        </thead>
        <tbody>
            @foreach (port Port in Model) {
                <tr>
                    <td>@Port.Id</td>
                    <td>@Port.MBN</td>
                    <td>@Port.Partner</td>
                </tr>
            }
        <tbody>
</table>

这不是最好的,我知道我可能有上百万种方法可以改进它,所以如果有人不介意帮忙,请给我发私信或者在这里发表评论?

谢谢

  • 奥达提亚

虽然您的解决方案似乎有效,但我会完全不同地实施它。

首先,您要连接到 orchard 数据库,这样您就可以使用 Orchard 的机制来访问数据库。假设您使用迁移创建了 table,您可以使用 IRepository 界面访问它。

注意你的端口模型必须在/Models目录下!:

/Models/Port.cs:

public class Port {
    public virtual int Id { get; set; }
    public virtual string MBN { get; set; }
    public virtual string Partner { get; set; }
}

Migrations.cs:

public int Create() {
    SchemaBuilder.CreateTable("Port",
        table => table
            .Column<int>("Id", column => column.PrimaryKey().Identity())
            .Column<string>("MDN", column => column.NotNull().WithDefault(""))
            .Column<string>("Partner", column => column.NotNull().WithDefault(""))
        );
    return 1;
}

/Controllers/PortingController.cs:

[Themed]
public class PortingController : Controller

    private readonly IRepository<Port> _repository;

    public PortingController(IRepository<Port> repository) {
        _repository = repository;
    }

    [HttpGet]
    public ActionResult Index() {
        // query the table
        var ports = _repository.Table.ToList();
        return View(ports);
    }

    [HttpPost]
    public ActionResult AddRequest(port item) {
        if (ModelState.IsValid) {
            _repository.Create(item);
        }

        return RedirectToAction("Index");
    }

}

然后在你的 Views/Porting/Index.cshtml:

@using Porting.Models
@model IEnumerable<Port>

@* display the models.. *@

@* display a form for creating a new one *@

@using (Html.BeginFormAntiForgeryPost(Url.Action("CreateRequest", "Port", new { area = "YourAreaName" }))) {
    // the form
}

参考 this post