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

时间:2017-06-04 11:14:25

标签: c# orchardcms orchardcms-1.10

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

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

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

  1. 客户导航到某个页面,并显示三个部分:提交和查看
  2. “提交”部分是一个窗口小部件,它是一个表单(很可能是自定义表单),它发布到控制器,并将该数据提交给数据库,我想我已经弄明白了......但是确保我将使用以下内容来执行此操作:

        [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();
    }
    
  3. 但是,我不确定这是否是正确的方法,我确信有更好的方法可以做到这一点,教程建议我使用contentParts和contentPart记录向数据库提交数据但是,这仅在从管理员方提交数据时有用,必须能够由最终用户从前端提交

    1. 第二部分是一个表格,它会从数据库中获取记录列表并将其显示给用户,但是,为此,我根本不知道如何解决这个问题,任何人都可以指点我的教程,示例源代码,甚至是实现此目的的代码片段?
    2. 值得注意的是,我已经浏览了在Orchard网站上创建模块和小部件的文档,但是,它们都是通过后端更新数据库...

      • Odatia

2 个答案:

答案 0 :(得分:1)

虽然您的解决方案似乎有效,但我会将其完全不同。

首先,您要连接到果园数据库,这样您就可以使用Orchard的机制来访问数据库。假设您使用迁移创建了表,可以使用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

答案 1 :(得分:0)

对于任何在这篇文章中寻找帮助的人,我以下列方式做了两件事:

控制器:

 [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的自定义表单控制器,而是发布到以下内容:〜/ {moduleName} / {Controller} / {动作}

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

@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>

这不是最好的,我知道可能有一百万种方法可以改善这一点,所以如果有人不介意帮忙请给我发私信,甚至只是在这里发表评论?

由于

  • Odatia