2017-06-04 22 views
1

我是新来的果业发展,C#和MVC,所以请原谅我,如果这其实很简单就是...果园小部件的前端DB访问

我用果园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(); 
    } 
    

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

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

值得注意的是,我已经通过文件走了果园的网站创建模块和部件,但是,它们都通过后台更新DB ...

  • Odatia

回答

1

虽然你的解决方案似乎工作,我会实现它完全不同。

首先,您正在连接到orchard db,因此您可以使用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"); 
    } 

} 

然后在您的浏览/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

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来改变形式的行动,从而代替使用果园的自定义表单控制器,它发布到以下内容:〜/ {模块名}/{控制器}/{行动}

然后用标准的剃须刀标记,将其从指数控制器例如GET变量:

@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