2013-07-08 32 views
0

我正在創建一個系統,用戶能夠創建新任務來完成,每個任務都有多個步驟。這一切都是通過一個輸入表單完成的,頂部有輸入任務詳細信息(名稱,說明等)的部分,以及下面輸入每個步驟的名稱和說明的部分。可以使用按鈕添加步驟,該按鈕在點擊時通過ajax創建一組新的控件,從而允許用戶根據需要製作多個步驟。MySQL查詢結果最終影響了錯誤的表

當模型被傳回(它們存儲在一個列表中)時,控制器正確地拾取輸入,但是在我的代碼的某處,我遇到了問題,因爲不是在步驟表中創建一個新步驟我的數據庫,創建一個重複的任務。所以我最終得到(1 +步數)創建的任務並且沒有步驟。

我希望對人們有意義。我正在使用MySQL和我寫的處理存儲過程的自定義MySQL分類。我對c#,.NET框架和MVC模型非常陌生,所以我可能構建我的代碼都是錯誤的,並且可能會以艱難的方式做事,但是在這裏。

這裏是我的代碼:使用

public class StoredProcService 
{ 
    private MySqlConnection Connect; 
    private MySqlCommand CMD; 
    public List<Object> Results { get; private set; } 

    public StoredProcService(string name, params MySqlParameter[] args) 
    { 
     QuerySetup(name); 

     foreach (var item in args) 
     { 
      AddParam(item); 
     } 

     DoQuery(); 
    } 

    public StoredProcService(string name) 
    { 
     QuerySetup(name); 
    } 

    //used by all constructors 
    private void QuerySetup(string name) 
    { 
     Connect = new MySqlConnection(ConfigurationManager.ConnectionStrings[<my actual connetion string is here>].ConnectionString); 
     CMD = new MySqlCommand(name, Connect); 
     CMD.CommandType = CommandType.StoredProcedure; 
    } 

    public void AddParam(MySqlParameter p,object pval) 
    { 
     CMD.Parameters.Add(p).Value = pval; 
    } 

    public void AddParam(MySqlParameter p) 
    { 
     CMD.Parameters.Add(p); 
    } 

    public void DoQuery() 
    { 
     Results = new List<Object>(); 
     MySqlDataReader myReader; 

     Connect.Open(); 

     myReader = CMD.ExecuteReader(); 
     int count = 0; 
     while (myReader.Read()) 
     { 
      Results.Add(myReader.GetValue(count)); 
      count++; 
     } 

     myReader.Close(); 
     Connect.Close(); 
    } 
} 

型號:

控制器:

[HttpPost] 
    public ActionResult Index(TaskCreateModel i) 
    {    
     if (!ModelState.IsValid) 
     { 
      ModelState.AddModelError("", "Please fill the required fields. All tasks require at least 1 step."); 
      return View(i); 
     } 

     //write task to the database 
     var proc = new StoredProcService("create_task"); 
     proc.AddParam(new MySqlParameter("Name", MySqlDbType.VarChar),i.Name); 
     proc.AddParam(new MySqlParameter("Description", MySqlDbType.VarChar),i.Description); 
     proc.AddParam(new MySqlParameter("Value", MySqlDbType.Float),i.Value); 
     proc.DoQuery(); 


     foreach (var item in i.Steps) 
     { 
      //add steps 
      var proc_steps = new StoredProcService("create_task_step"); 
      proc_steps.AddParam(new MySqlParameter("Name", MySqlDbType.VarChar), item.Name); 
      proc_steps.AddParam(new MySqlParameter("Description", MySqlDbType.VarChar), item.Description); 
      proc_steps.AddParam(new MySqlParameter("taskID", MySqlDbType.Int32), proc.Results.ElementAt(0)); 
      proc.DoQuery(); 
     } 
     return View(); 
    } 

存儲過程服務

public class TaskCreateModel 
{ 

    [Required] 
    [Display(Name = "Task Name")] 
    public string Name { get; set; } 

    [Display(Name = "Task Description")] 
    public string Description { get; set; } 

    [Required] 
    [Display(Name = "Task Value")] 
    [DisplayFormat(DataFormatString = "${0:F2}")] 
    public float Value { get; set; } 

    [Required] 
    public List<StepCreateModel> Steps { get; set; } 

} 

public class StepCreateModel 
{ 
    [Required] 
    [Display(Name = "Step Name")] 
    public string Name { get; set; } 

    [Required] 
    [Display(Name = "Description")] 
    public string Description { get; set; } 
} 

瀏覽:

@model ExampleProject.Models.TaskCreateModel 
@{ 
    ViewBag.Title = "Create Task"; 
} 

<h2>@ViewBag.Title</h2> 
@using (Html.BeginForm("index", "CreateTask")) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend> 
      Please enter task details below: 
     </legend> 
     @Html.Partial("_CreateTaskPartial") 
     <input type="submit" value="Create Task" /> 
    </fieldset> 
    <fieldset> 
     <legend> 
      Steps 
     </legend> 
     <div id="editorRows"> 

     </div> 
     @Ajax.ActionLink("Add Step","BlankEditorRow", new AjaxOptions{ InsertionMode= System.Web.Mvc.Ajax.InsertionMode.InsertAfter, 
                  HttpMethod="Get", UpdateTargetId="editorRows"}) 
     @Html.EditorFor(x => x.Steps) 
    </fieldset> 
} 

這是(我還沒有張貼一個由AJAX調用,因爲我的AJAX正常工作)呼籲在前面視圖的局部視圖

@model ExampleProject.Models.TaskCreateModel 

<ul> 
    <li> 
     @Html.LabelFor(m => m.Name) 
     @Html.TextBoxFor(m => m.Name) 
     @Html.ValidationMessageFor(m => m.Name) 
    </li> 
    <li> 
     @Html.LabelFor(m => m.Description) 
     @Html.TextBoxFor(m => m.Description) 
     @Html.ValidationMessageFor(m => m.Description) 
    </li> 
    <li> 
     @Html.LabelFor(m => m.Value) 
     @Html.TextBoxFor(m => m.Value) 
     @Html.ValidationMessageFor(m => m.Value) 
    </li> 
</ul> 

存儲過程:

DELIMITER $$ 

CREATE DEFINER=`<me>`@`localhost` PROCEDURE `create_task`(in name VARCHAR(128), in description VARCHAR(255), in value FLOAT) 
BEGIN 
    INSERT INTO tasks (Name,Description,Value) 
    VALUES (name,description,value); 
    SELECT LAST_INSERT_ID() as TaskID; 
END 

CREATE DEFINER=`<me>`@`localhost` PROCEDURE `create_task_step`(in Name varchar(128), in Description VARCHAR(255), in TaskID INT) 
BEGIN 
    INSERT INTO steps (name,description,taskID) 
    VALUES (Name, Description, TaskID); 
    SELECT LAST_INSERT_ID() as StepID; 
END 

回答

0

Aaaaaaaaaaaaaand我修好了它。我不小心使用了proc.DoQuery而不是proc_steps.DoQuery。

它現在的工作完美無缺