MVC Html.BeginForm 和页面重新加载
MVC Html.BeginForm and page reload
我以前用 C#/Winforms 开发一些应用程序,现在我正在尝试使用 MVC 学习 Web 开发。
新概念很多(JS、Ajax、ASP.net等...),请多多包涵...
看了很多,开始动手尝试了,但是还是有一点不明白
例如,我想通过表单向数据库中插入数据,只插入,没有别的。
插入的方法在控制器中
明显的方法是使用 Html 助手 @Html.BeginForm
。在这一步,我无法在不重新加载整个页面的情况下执行此操作。
由于我没有找到任何明确的答案,你能帮我吗?
1-@Html.BeginForm
是否可以在发布表单后不执行任何操作以插入数据库(可能在控制器中使用特定的 return 类型的操作)或 Ajax.BeginForm
是唯一解吗?
2-更新页面的一部分,是ajax唯一的解决方案吗?
非常感谢。
有很多概念可以让您动脑筋。让我们从两个基本选择开始。使用简单的 post 返回或 JavaScript 和 Ajax?
更新日期
好的,让我们开始第一个,一个简单的创建过程。
您将需要数据库 table 进行更新。您可以从数据库创建一个 Entity Framework 模型。您的应用程序将与此向上更新交互 table。这是 MVC 中的 "M" 或模型。您还需要创建一个控制器(MVC 中的 "C")和一个视图(MVC 中的 "V")。
控制器通常包含两种方法来执行工作。当用户导航到网页时,他们获取初始数据。所有这一切都是 return 具有空模型的视图,因此任何编辑控件都处于默认状态 - 例如空文本框
[HttpGet]
public ActionResult Create()
{
return View();
}
当用户保存视图时,将调用另一个方法(同名)。请注意,这是 POST 方法,因此 FORM 中的所有数据都打包到 ModelState 中。 MVC 会为您将模型绑定到方法的参数中——您甚至可以说要包含哪些参数。这里的版本使用Async.
您视图中的 FORM 也应该有一个防伪标记,这是第一个(隐藏)字段 return 由 MVC 系统编辑和使用 - 您通常看不到它。
假设数据有效,它被保存到数据库中(我通常有一个底层业务模型来完成保持控制器清洁的工作)。如果模型无效(例如缺少字段),现有模型将连同任何错误消息一起传递回视图,供用户进行另一次尝试。查看数据注释以了解如何定义有效值范围。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "YourName")] MyData model)
{
if (ModelState.IsValid)
{
await _bs.MyData_UpdateAsync(model);
return RedirectToAction("Index");
}
// return with any errors
return View(model);
}
最后,您需要一个视图,HTML 从中动态生成并传递给客户端浏览器
@model MyApp.Models.MyData
@{
ViewBag.Title = "Create Something";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container w-50">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.YourName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.YourName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.YourName, "", new { @class = "text-danger" })
</div>
<div class="d-flex">
<div class="ml-auto">
<input type="submit" value="Create" class="btn btn-primary btn-sm btn-default" />
</div>
</div>
</div>
}
</div>
我已经使用 ajax 在 asp.net 核心中创建了一个包含 post 数据的表格
它的工作
创建局部视图
@model Department
<h2>Create</h2>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
<div class="form-horizontal">
<form asp-action="Create" role="form" asp-controller="Department" asp-antiforgery="true"
data-ajax-success="Bindgrid"
data-ajax="true"
data-ajax-method="POST">
<div class="form-group">
<label class="control-label" asp-for="DepartmentName"></label>
<input class="form-control" type="text" asp-for="DepartmentName" />
<span asp-validation-for="DepartmentName" class="text-danger"></span>
</div>
<input class="btn btn-primary" type="submit" value="Save" />
</form>
</div>
控制器逻辑
[ValidateAntiForgeryToken()]
[HttpPost]
public JsonResult Create(Department department)
{
if (ModelState.IsValid)
{
Context.Department.Add(department);
Context.SaveChanges();
}
return Json(department);
}
您可以使用 Razor 或 ajax 将部分视图加载到视图中。当页面的同一部分可以有不同的视图时,我会使用这种技术——例如,像一个选项卡式控件
你用 MVC 的通常风格组成了一个 URL。在此示例中,我假设对某些现有数据执行了 HTTP GET。对于您的 CREATE GET 选项,仅控制器和操作就足够了。请注意,操作中的 HTML return 替换了页面其他地方 DIV 的内容
var targetUrl = "/MyController/MyAction/" + id + "?extraParameter=" + 123;
//-----------------------------------------
// get content from URL using Ajax
//-----------------------------------------
$.ajax({
url: targetUrl,
type: "get",
success: function (result) {
$("#divPageContent").html(result);
}
});
您可以从控制器加载 CREATE 视图,如上所示。您需要一个保存按钮,点击后,调用 Ajax 将您的值 POST 传回服务器。
您应该在您的视图中使用带有 AntiForgeryToken 的 FORM,并使用 Ajax POST。我不建议使用 HTTP GET 添加或更改数据。
有大量资源可以向您展示如何做到这一点。
假设您的 CREATE 过程有效,您可以 return 显示结果的任何视图,返回到用于创建的相同 DIV。
许多开发人员使用这种技术,甚至到了动态加载所有内容的单页网站的地步。
对于我的站点,我发现大多数进程无需诉诸 Ajax 即可正常工作。现代浏览器可以很好地处理内容变化和闪烁。我求助于 Ajax 以获取更复杂页面中的部分视图。如果您要走 Ajax 路线,请考虑一个忙碌指示器 - 当 Ajax 工作时,它会弹出您选择的图标,以便您的用户知道该页面正在做一些工作。
$(function () {
$(document).ajaxStart(function () {
$(".processSpinner").show();
});
$(document).ajaxStop(function () {
$(".processSpinner").hide();
});
$(document).ajaxError(function () {
$(".processSpinner").hide();
});
$(".processSpinner").hide();
});
include antiforgerytoken in ajax post ASP.NET MVC
我以前用 C#/Winforms 开发一些应用程序,现在我正在尝试使用 MVC 学习 Web 开发。
新概念很多(JS、Ajax、ASP.net等...),请多多包涵...
看了很多,开始动手尝试了,但是还是有一点不明白
例如,我想通过表单向数据库中插入数据,只插入,没有别的。
插入的方法在控制器中
明显的方法是使用 Html 助手 @Html.BeginForm
。在这一步,我无法在不重新加载整个页面的情况下执行此操作。
由于我没有找到任何明确的答案,你能帮我吗?
1-@Html.BeginForm
是否可以在发布表单后不执行任何操作以插入数据库(可能在控制器中使用特定的 return 类型的操作)或 Ajax.BeginForm
是唯一解吗?
2-更新页面的一部分,是ajax唯一的解决方案吗?
非常感谢。
有很多概念可以让您动脑筋。让我们从两个基本选择开始。使用简单的 post 返回或 JavaScript 和 Ajax?
更新日期好的,让我们开始第一个,一个简单的创建过程。
您将需要数据库 table 进行更新。您可以从数据库创建一个 Entity Framework 模型。您的应用程序将与此向上更新交互 table。这是 MVC 中的 "M" 或模型。您还需要创建一个控制器(MVC 中的 "C")和一个视图(MVC 中的 "V")。
控制器通常包含两种方法来执行工作。当用户导航到网页时,他们获取初始数据。所有这一切都是 return 具有空模型的视图,因此任何编辑控件都处于默认状态 - 例如空文本框
[HttpGet]
public ActionResult Create()
{
return View();
}
当用户保存视图时,将调用另一个方法(同名)。请注意,这是 POST 方法,因此 FORM 中的所有数据都打包到 ModelState 中。 MVC 会为您将模型绑定到方法的参数中——您甚至可以说要包含哪些参数。这里的版本使用Async.
您视图中的 FORM 也应该有一个防伪标记,这是第一个(隐藏)字段 return 由 MVC 系统编辑和使用 - 您通常看不到它。
假设数据有效,它被保存到数据库中(我通常有一个底层业务模型来完成保持控制器清洁的工作)。如果模型无效(例如缺少字段),现有模型将连同任何错误消息一起传递回视图,供用户进行另一次尝试。查看数据注释以了解如何定义有效值范围。
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "YourName")] MyData model)
{
if (ModelState.IsValid)
{
await _bs.MyData_UpdateAsync(model);
return RedirectToAction("Index");
}
// return with any errors
return View(model);
}
最后,您需要一个视图,HTML 从中动态生成并传递给客户端浏览器
@model MyApp.Models.MyData
@{
ViewBag.Title = "Create Something";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div class="container w-50">
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="form-horizontal">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="form-group">
@Html.LabelFor(model => model.YourName, htmlAttributes: new { @class = "control-label" })
@Html.EditorFor(model => model.YourName, new { htmlAttributes = new { @class = "form-control" } })
@Html.ValidationMessageFor(model => model.YourName, "", new { @class = "text-danger" })
</div>
<div class="d-flex">
<div class="ml-auto">
<input type="submit" value="Create" class="btn btn-primary btn-sm btn-default" />
</div>
</div>
</div>
}
</div>
我已经使用 ajax 在 asp.net 核心中创建了一个包含 post 数据的表格 它的工作 创建局部视图
@model Department
<h2>Create</h2>
<script src="~/lib/jquery/dist/jquery.js"></script>
<script src="~/lib/jquery-validation/dist/jquery.validate.js"></script>
<script src="~/lib/jquery-validation-unobtrusive/jquery.validate.unobtrusive.js"></script>
<div class="form-horizontal">
<form asp-action="Create" role="form" asp-controller="Department" asp-antiforgery="true"
data-ajax-success="Bindgrid"
data-ajax="true"
data-ajax-method="POST">
<div class="form-group">
<label class="control-label" asp-for="DepartmentName"></label>
<input class="form-control" type="text" asp-for="DepartmentName" />
<span asp-validation-for="DepartmentName" class="text-danger"></span>
</div>
<input class="btn btn-primary" type="submit" value="Save" />
</form>
</div>
控制器逻辑
[ValidateAntiForgeryToken()]
[HttpPost]
public JsonResult Create(Department department)
{
if (ModelState.IsValid)
{
Context.Department.Add(department);
Context.SaveChanges();
}
return Json(department);
}
您可以使用 Razor 或 ajax 将部分视图加载到视图中。当页面的同一部分可以有不同的视图时,我会使用这种技术——例如,像一个选项卡式控件
你用 MVC 的通常风格组成了一个 URL。在此示例中,我假设对某些现有数据执行了 HTTP GET。对于您的 CREATE GET 选项,仅控制器和操作就足够了。请注意,操作中的 HTML return 替换了页面其他地方 DIV 的内容
var targetUrl = "/MyController/MyAction/" + id + "?extraParameter=" + 123;
//-----------------------------------------
// get content from URL using Ajax
//-----------------------------------------
$.ajax({
url: targetUrl,
type: "get",
success: function (result) {
$("#divPageContent").html(result);
}
});
您可以从控制器加载 CREATE 视图,如上所示。您需要一个保存按钮,点击后,调用 Ajax 将您的值 POST 传回服务器。
您应该在您的视图中使用带有 AntiForgeryToken 的 FORM,并使用 Ajax POST。我不建议使用 HTTP GET 添加或更改数据。
有大量资源可以向您展示如何做到这一点。
假设您的 CREATE 过程有效,您可以 return 显示结果的任何视图,返回到用于创建的相同 DIV。
许多开发人员使用这种技术,甚至到了动态加载所有内容的单页网站的地步。
对于我的站点,我发现大多数进程无需诉诸 Ajax 即可正常工作。现代浏览器可以很好地处理内容变化和闪烁。我求助于 Ajax 以获取更复杂页面中的部分视图。如果您要走 Ajax 路线,请考虑一个忙碌指示器 - 当 Ajax 工作时,它会弹出您选择的图标,以便您的用户知道该页面正在做一些工作。
$(function () {
$(document).ajaxStart(function () {
$(".processSpinner").show();
});
$(document).ajaxStop(function () {
$(".processSpinner").hide();
});
$(document).ajaxError(function () {
$(".processSpinner").hide();
});
$(".processSpinner").hide();
});
include antiforgerytoken in ajax post ASP.NET MVC