J'ai une liste déroulante qui montre le Code & BudgetCodename de db.Budgets de la base de données.
L'extrait de vue ressemble à ceci:
[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); } ``````
et le contrôleur ressemble à ceci:
[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); }
Le menu déroulant semble correct, et affiche à la fois le code et le budgetCodeName.
Mais la boîte ne renvoie pas les données à la base de données SQL. Aucune erreur n'est créée.
Qu'est-ce que j'aurais pu faire de mal?
**** Modifier ****
J'ai essayé de placer le texte du contrôleur comme tel, mais cela ne fonctionne pas:
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"); }
**** Update ****
J'ai constaté que la suppression de l'async du contrôleur publie le nombre entier dans la table. Comment puis-je le faire fonctionner avec async? ou est-ce que cela vaut la peine d'abandonner complètement async si je ne m'attends pas à de lourdes charges ou à des problèmes de bande passante en raison d'une petite base d'utilisateurs?
@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> }
3 Réponses :
Vous devez regrouper les données que vous souhaitez POSTER dans un formulaire:
public ActionResult Post(MyModel model) { //call a service to save info to database }
Votre action POST doit accepter le modèle que vous publiez:
@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> }
S'il vous plaît voir mon message mis à jour
Dans votre code. Les données que vous envoyez dans une méthode d'action sont de type POST.
[HttpPost]
[ValidateAntiForgeryToken] public async Task Create ()
Vous devez définir le "FormMethod" dans votre page d'affichage. Par exemple:
@using (Html.BeginForm ("ActionMethod Name", "Controller Name", FormMethod.Post)) {
} » J'espère que c'est mon aide.
non, car j'utilise @model Assets.Areas.Clinical.Models.ClinicalAsset. tous les autres champs sont renvoyés très bien
J'ai constaté que la suppression de l'async du contrôleur renvoie l'entier dans la table.
[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); }
lorsque vous soumettez le formulaire, l'action est-elle touchée? pouvez-vous mettre un point d'arrêt de débogage dans votre action POST Create pour vérifier?
@ johnluke.laue J'ai trouvé que la suppression de l'async du contrôleur renvoie l'entier dans la table. Comment puis-je le faire fonctionner avec async? ou est-ce que cela vaut la peine d'abandonner complètement l'async si je ne m'attends pas à de lourdes charges ou à des problèmes de bande passante en raison d'une petite base d'utilisateurs?