我是Orchard开发,C#和MVC的新手,请原谅我,如果这很简单......
我在我的职业中使用了Orchard CMS,所以我理解了小部件,图层区域,内容部分等...但是,我已经完成了改进其中一个非常常见的过程的任务,我决定最好的方法为此目的创建一个模块。
使用小部件的过程的基本概要如下:
“提交”部分是一个窗口小部件,它是一个表单(很可能是自定义表单),它发布到控制器,并将该数据提交给数据库,我想我已经弄明白了......但是确保我将使用以下内容来执行此操作:
[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记录向数据库提交数据但是,这仅在从管理员方提交数据时有用,必须能够由最终用户从前端提交
值得注意的是,我已经浏览了在Orchard网站上创建模块和小部件的文档,但是,它们都是通过后端更新数据库...
答案 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>
这不是最好的,我知道可能有一百万种方法可以改善这一点,所以如果有人不介意帮忙请给我发私信,甚至只是在这里发表评论?
由于