ASP.NET MVC5 Html.Beginform 不调用操作方法



我让我的提交表单从我的 razor 文件到控制器,然后从控制器到我的远程数据库。 但现在我什至不认为控制器类被调用了。

以下是我的观点:

@model InputEvent
@using (Html.BeginForm("Save", "Portal/Controllers/MyEvent"))
{
    <md-input-container class="md-block" flex-gt-xs="">
        <label>Title</label>                    
        @Html.TextBoxFor(m => m.title)
    </md-input-container>
    <md-input-container class="md-block">
        <label>Address</label>                        
        @Html.TextBoxFor(m => m.address)
    </md-input-container>
    <md-button class="md-raised">
        <input type="submit" value="Save" />
    </md-button>
}

使用我的模型:

public class InputEvent
{
    public string title;
    public string address;
}

还有我的控制器与数据库连接:

namespace Portal.Controllers
{  
public class MyEventController : Controller
{      
    [HttpPost]
    public ActionResult Save(InputEvent y)
    {            
        MySqlConnection conn = new MySqlConnection("mydbstring");
        string myTitle = y.title;
        string myAddress = y.address;
        conn.Open();                         
        MySql.Data.MySqlClient.MySqlCommand comm = conn.CreateCommand();
        comm.CommandText = "INSERT INTO event(title, address) VALUES(@title, @address)";
        //comm.Parameters.AddWithValue("@title", myTitle);
        //comm.Parameters.AddWithValue("@address", myAddress);
        comm.Parameters.AddWithValue("@title", "test_title");
        comm.Parameters.AddWithValue("@address", "test_address");
        comm.ExecuteNonQuery();
        conn.Close();
        return View();
    }        
}
}

我是否正确调用了控制器?还是我的 sql 命令无效?

编辑:一个多小时后,我刚刚再次检查了我的数据库,我有多行带有"test_title"和"test_address"。 我想我的代码有效,但它非常延迟。这可能不是最好的提问地点,但有没有人知道为什么它会如此延迟地插入数据库?

确保服务器端代码类似于下面的代码。请注意 [HttpPost] 属性。虽然客户端窗体的默认值为 Post,但 HttpGet 是服务器端的默认值。因此,您必须明确表示要在服务器端使用HttpPost。执行以下步骤。注意Save方法有两个重载,一个使用 HttpGet,另一个使用 HttpPost 。完成后,在具有 HttpPost 属性的方法上放置一个断点并发布窗体。您将看到模型将被水合。

步骤 1

    @using (Html.BeginForm("Save", "MyEvent", FormMethod.Post))
    {
       <md-input-container class="md-block" flex-gt-xs="">
        <label>Title</label>                    
        @Html.TextBoxFor(m => m.title)
       </md-input-container>
      <md-input-container class="md-block">
        <label>Address</label>                        
        @Html.TextBoxFor(m => m.address)
      </md-input-container>
      <md-button class="md-raised">
        <input type="submit" value="Save" />
      </md-button>
   }

步骤 2

 public class MyEventController : Controller
 {
     [HttpPost]
     public ActionResult Save(InputEvent model)
     {     
         // Consider refining the implementation to use Stored Procedures or an ORM e.g. Entity Framework. 
         // It helps secure your app. Application security advice.    
         MySqlConnection conn = new MySqlConnection("mydbstring"); 
         conn.Open();                        
         MySql.Data.MySqlClient.MySqlCommand comm = conn.CreateCommand();
         comm.CommandText = "INSERT INTO event(title, address) VALUES(" + model.title + "," + model.address + ")";  
         comm.ExecuteNonQuery();
         conn.Close();    
         return View();
     }
     [HttpGet]
     public ActionResult Save()
     {                
         return View();
     }
 }

FormMethod.Post添加为第三个参数...您的操作方法是查看帖子而不是 Get。

@using (Html.BeginForm("Save", "MyEvent", FormMethod.Post)){
  ....
}

我看到你的代码现在可以工作了。但是,您不应该以现在的方式从 POST 方法返回视图。您应该使用 PRG 模式。阅读该链接,以便了解代码可能导致的问题。我知道这是针对 MVC 4 的,但无论 MVC 的版本如何,模式都是相同的。

最新更新