我让我的提交表单从我的 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 的版本如何,模式都是相同的。