c# - 下拉列表中的 Asp.net MVC 多个字段无法回发到数据库
问题描述
我有一个下拉列表,显示数据库中 db.Budgets 的代码和 BudgetCodename。
视图片段如下所示:
@using (Html.BeginForm())
{
@Html.AntiForgeryToken()
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
<div class="panel-btns">
<a href="" class="minimize">−</a>
</div>
<h4 class="panel-title">Block Styled Form</h4>
<p>This is an example of form with block styled label.</p>
</div>
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class="panel-body">
<div class="row">
<div class="col-sm-6">
<div class="form-group">
@Html.LabelFor(model => model.BudgetCodeID, "BudgetCode:", new { @class = "control-label" })
@Html.DropDownListFor(m => m.BudgetCodeID, (SelectList)ViewBag.BudgetsList, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.BudgetCodeID, "", new { @class = "text-danger" })
</div>
}
控制器看起来像这样:
public ActionResult Create()
{
var Budgets = (from m in db.BudgetCodes
select new SelectListItem {
Text = m.Code + "| " + m.BudgetCodeName,
Value = m.BudgetCodeID.ToString()
});
ViewBag.BudgetsList = new SelectList(Budgets, "Value", "Text");
}
下拉菜单看起来不错,并且显示了 E Code 和 BudgetCodeName。
但该框不会将数据回传到 sql 数据库。不会产生错误。
我做错了什么?
****编辑****
我试过这样放置控制器文本,但它不起作用:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Create([Bind(Include = "ClinicalAssetID,AssetTypeID,ProductID,ManufacturerID,ModelID,SupplierID,SerialNo,PurchaseDate,PoNo,Costing,TeamID,StaffID,WarrantyEndDate,InspectionDate,InspectionOutcome,InspectionDocumnets,InspectionDueDate,BudgetCodeID")] ClinicalAsset clinicalAsset)
{
if (ModelState.IsValid)
{
db.ClinicalAssets.Add(clinicalAsset);
await db.SaveChangesAsync();
return RedirectToAction("Index");
}
ViewBag.AssetTypeID = new SelectList(db.AssetTypes, "AssetTypeID", "AssetTypeName", clinicalAsset.AssetTypeID);
ViewBag.ProductID = new SelectList(db.Products, "ProductID", "ProductName", clinicalAsset.ProductID);
ViewBag.ModelID = new SelectList(db.Models, "ModelID", "ModelName", clinicalAsset.ModelID);
ViewBag.ManufacturerID = new SelectList(db.Manufacturers, "ManufacturerID", "ManufacturerName", clinicalAsset.ManufacturerID);
ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "SupplierName", clinicalAsset.SupplierID);
ViewBag.TeamID = new SelectList(db.Teams, "TeamID", "TeamName", clinicalAsset.TeamID);
ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "StaffName", clinicalAsset.StaffID);
ViewBag.InspectionOutcomeID = new SelectList(db.InspectionOutcomes, "InspectionOutcomeID", "InspectionOutcomeResult", clinicalAsset.InspectionOutcomeID);
var Budgets = (from m in db.BudgetCodes
select new SelectListItem
{
Text = m.Code + " | " + m.BudgetCodeName,
Value = m.BudgetCodeID.ToString()
});
ViewBag.BudgetsList = new SelectList(Budgets, "Value", "Text");
return View(clinicalAsset);
}
****更新****
我发现从控制器中删除异步确实会将整数回传到表中。然后我如何使它与 async 一起工作?或者,如果我不希望由于用户群小而导致负载过重或带宽问题,是否值得完全放弃异步?
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create([Bind(Include = "ClinicalAssetID,AssetTypeID,ProductID,ManufacturerID,ModelID,SupplierID,SerialNo,PurchaseDate,PoNo,Costing,TeamID,StaffID,WarrantyEndDate,InspectionDate,InspectionOutcome,InspectionDocumnets,InspectionDueDate, BudgetCodeID")] ClinicalAsset clinicalAsset)
{
if (ModelState.IsValid)
{
db.ClinicalAssets.Add(clinicalAsset);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.AssetTypeID = new SelectList(db.AssetTypes, "AssetTypeID", "AssetTypeName", clinicalAsset.AssetTypeID);
ViewBag.ProductID = new SelectList(db.Products, "ProductID", "ProductName", clinicalAsset.ProductID);
ViewBag.ModelID = new SelectList(db.Models, "ModelID", "ModelName", clinicalAsset.ModelID);
ViewBag.ManufacturerID = new SelectList(db.Manufacturers, "ManufacturerID", "ManufacturerName", clinicalAsset.ManufacturerID);
ViewBag.SupplierID = new SelectList(db.Suppliers, "SupplierID", "SupplierName", clinicalAsset.SupplierID);
ViewBag.TeamID = new SelectList(db.Teams, "TeamID", "TeamName", clinicalAsset.TeamID);
ViewBag.StaffID = new SelectList(db.Staffs, "StaffID", "StaffName", clinicalAsset.StaffID);
ViewBag.InspectionOutcomeID = new SelectList(db.InspectionOutcomes, "InspectionOutcomeID", "InspectionOutcomeResult", clinicalAsset.InspectionOutcomeID);
var Budgets = (from m in db.BudgetCodes
select new SelectListItem
{
Text = m.Code + " | " + m.BudgetCodeName,
Value = m.BudgetCodeID.ToString()
});
ViewBag.BudgetsList = new SelectList(Budgets, "Value", "Text");
return View(clinicalAsset);
}
``````
解决方案
您需要将要发布的数据包装到表单中:
@using (Html.BeginForm("Search", "YOUR CONTROLLER", FormMethod.Post)) {
<div class="form-group">
@Html.LabelFor(model => model.BudgetCodeID, "BudgetCode:", new { @class = "control-label" })
@Html.DropDownListFor(m => m.BudgetCodeID, (SelectList)ViewBag.BudgetsList, new { @class = "form-control" })
@Html.ValidationMessageFor(model => model.BudgetCodeID, "", new { @class = "text-danger" })
</div>
}
您的 POST 操作需要接受您发布的模型:
public ActionResult Post(MyModel model)
{
//call a service to save info to database
}
推荐阅读
- html - 使传单地图全屏无滚动条
- javascript - 在不同的屏幕中设置 Redux 商店监听器
- postgresql - 如何使用 Spring Boot Rest API 以图形方式更新 Grafana 表?
- java - 如何在 Firebase 中获取孩子的密钥?
- android - 在 Android 源代码中设置文件权限
- security - 使用命令提示符管理员设置 PIN
- javascript - 选择所有具有特定值的输入元素并使用 Javascript 更改它们的值
- flutter - 'package:flutter/src/widgets/navigator.dart':断言失败:第 4517 行 pos 12:'!_debugLocked':不正确
- vue.js - 如何使用 sass-loader 在 vue.config.js 中配置 Dart Sass 原生可执行文件(dart VM)?
- php - 如何像 Wapka 一样在 php 中制作自己的标签系统