Forms 如何多次提交表单(asp.net core razor)
我正在尝试创建一个表单,可以使用不同的信息多次提交,同时在一个字段中保留一个公共值 我在ASP.NET Core Razor中的SQL表中有一个列表视图,它是一个建筑项目列表。对于列表中的每一行,我都有一个指向“创建”模板页面的链接,用户可以在该页面中为存储在不同表中的项目创建投标条目。项目编号指定给路线值(asp路线编号=“上一列表中的项目编号”),并填充“创建新投标”表单中的隐藏字段 使用razor页面的默认代码,一切都很好。单击“提交”并返回到项目列表 我想做的是在“创建新投标”表单上有另一个选项,允许您保存并输入同一项目的另一个投标。我创建了另一个按钮和处理程序来实现这一点,但我仍然坚持实际实现它。如果我使用return Page(),表单将发布,页面将返回完整的路由数据,但文本字段仍包含以前的数据,下拉列表为空。如果我使用return-RedirectToPage(createnewpid,Route-data),表单将发布,但路由数据似乎没有传递,并创建空值错误 这是来自Projects列表(在foreach表中)的链接,它将带您进入“CreateBid”表单,并且运行良好Forms 如何多次提交表单(asp.net core razor),forms,asp.net-core,razor-pages,Forms,Asp.net Core,Razor Pages,我正在尝试创建一个表单,可以使用不同的信息多次提交,同时在一个字段中保留一个公共值 我在ASP.NET Core Razor中的SQL表中有一个列表视图,它是一个建筑项目列表。对于列表中的每一行,我都有一个指向“创建”模板页面的链接,用户可以在该页面中为存储在不同表中的项目创建投标条目。项目编号指定给路线值(asp路线编号=“上一列表中的项目编号”),并填充“创建新投标”表单中的隐藏字段 使用razor页面的默认代码,一切都很好。单击“提交”并返回到项目列表 我想做的是在“创建新投标”表单上有另
<a asp-page="CreateBid" asp-route-Number="@item.ProjectNumber" asp-route-opwid="@item.Id">New Bid</a>
新出价
创建投标表格需要提交以下内容并创建另一个条目
int num = int.Parse(Request.Query["Number"]);
int idnum = int.Parse(Request.Query["opwid"]);
<input type="submit" value="Save and enter another"
asp-page-handler="Another" asp-route-opwid="@idnum"
asp-route-Number="@num" class="btn btn-primary"/>
intnum=int.Parse(Request.Query[“Number]”);
int idnum=int.Parse(Request.Query[“opwid”]);
和处理程序:
public async Task<IActionResult> OnPostAnotherAsync(int Number, int opwid)
{
if (!ModelState.IsValid)
{
return Page();
}
_context.OpwBids.Add(OpwBids);
await _context.SaveChangesAsync();
return Page();
//return RedirectToPage("./CreateBid", (Number == num, opwid == idnum));
}
PostanotherAsync上的公共异步任务(int-Number,int-opwid)
{
如果(!ModelState.IsValid)
{
返回页();
}
_context.OpwBids.Add(OpwBids);
wait_context.SaveChangesAsync();
返回页();
//返回RedirectToPage(“./CreateBid”,(Number==num,opwid==idnum));
}
我还在“重定向到页面”中的路由参数(与使用变量相反)中尝试了一些方法,但似乎没有任何效果
有没有更简单的方法,或者我只是错过了什么
这是cshtml文件:
@page
@model Authorization_AD.Pages.GenSvc.BidEntry.CreateBidModel
@{
ViewData["Title"] = "CreateBid";
}
@{ int num = int.Parse(Request.Query["Number"]);
int idnum = int.Parse(Request.Query["opwid"]);
}
<h1>Create Bid</h1>
<h4>OPW number @num</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form method="post">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<input asp-for="OpwBids.OpwProject" value="@idnum" hidden class="form-control" />
</div>
<div class="form-group">
<label asp-for="OpwBids.OpeningDate" class="control-label"></label>
<input asp-for="OpwBids.OpeningDate" class="form-control" />
<span asp-validation-for="OpwBids.OpeningDate" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="OpwBids.Contractor" class="control-label"></label>
<select asp-for="OpwBids.Contractor" class="form-control" asp-items="ViewBag.Contractor">
<option disabled selected>--- SELECT ---</option>
</select>
</div>
<div class="form-group">
<label asp-for="OpwBids.BidAmount" class="control-label"></label>
<input asp-for="OpwBids.BidAmount" class="form-control" />
<span asp-validation-for="OpwBids.BidAmount" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save and enter another"
asp-page-handler="Another" asp-route-opwid="@idnum"
asp-route-Number="@num" class="btn btn-primary"/>
<input type="submit" value="Save and return to list" asp-page-handler="Done" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-page="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
@page
@模型授权_AD.Pages.GenSvc.BidEntry.CreateBidModel
@{
ViewData[“Title”]=“CreateBid”;
}
@{int num=int.Parse(Request.Query[“Number]”);
int idnum=int.Parse(Request.Query[“opwid”]);
}
创建投标
OPW编号@num
---挑选---
返回列表
@节脚本{
@{wait Html.RenderPartialAsync(“_validationScript”);}
}
这是C#文件:
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
使用Microsoft.AspNetCore.Mvc.RazorPages;
使用Microsoft.AspNetCore.Mvc.Rendering;
使用授权和广告模式;
命名空间授权_AD.Pages.GenSvc.BidEntry
{
公共类CreateBidModel:PageModel
{
私有只读授权\u AD.Models.OPWContext\u上下文;
公共CreateBidModel(授权\ AD.Models.OPWContext上下文)
{
_上下文=上下文;
}
公共IActionResult OnGet()
{
ViewData[“Contractor”]=新的选择列表(_context.contactors,“Id”,“ContractorName”);
ViewData[“OpwProject”]=新的选择列表(_context.MainProjectsListing,“Id”,“ProjectNumber”);
返回页();
}
[BindProperty]
公共OpwBids OpwBids{get;set;}
PostDoneAsync()上的公共异步任务
{
如果(!ModelState.IsValid)
{
返回页();
}
_context.OpwBids.Add(OpwBids);
wait_context.SaveChangesAsync();
返回页首(“/索引”);
}
PostanotherAsync上的公共异步任务(int-Number,int-opwid)
{
如果(!ModelState.IsValid)
{
返回页();
}
_context.OpwBids.Add(OpwBids);
wait_context.SaveChangesAsync();
返回页();
//返回RedirectToPage(“./CreateBid”,Number==OpwBids.OpwProjectNavigation.ProjectNumber,opwid==OpwBids.OpwProject));
}
}
}
您可以向页面添加一个属性,用于绑定单击按钮的值
public class CreateBidModel : PageModel {
//...
//Add this property to your page.
[BindProperty]
public string Button {get;set;}
public void OnGet(int number,string opwid){
//Set the number and opwid to the target properties
}
public Task<IActionResult> OnPostAsync(){
if (!ModelState.IsValid)
{
return Page();
}
_context.OpwBids.Add(OpwBids);
await _context.SaveChangesAsync();
if(Button == "finish"){
return RedirectToPage("./Index");
}
else {
return RedirectToPage("./CreateBid", (Number == OpwBids.OpwProjectNavigation.ProjectNumber, opwid == OpwBids.OpwProject));
}
}
}
公共类CreateBidModel:PageModel{
//...
//将此属性添加到您的页面。
[BindProperty]
公共字符串按钮{get;set;}
公共void OnGet(整数,字符串opwid){
//将数字和opwid设置为目标属性
}
公共任务OnPostAsync(){
如果(!ModelState.IsValid)
{
返回页();
}
_context.OpwBids.Add(OpwBids);
wait_context.SaveChangesAsync();
如果(按钮==“完成”){
返回页首(“/索引”);
}
否则{
返回RedirectToPage(“./CreateBid”,Number==OpwBids.OpwProjectNavigation.ProjectNumber,opwid==OpwBids.OpwProject));
}
}
}
在视图中,您需要添加两个具有相同名称的按钮,并且该值将映射到Button属性
<form method="post">
... Other content goes here
<button name="@Html.NameFor(m => m.Button)" value="another">Create another</button>
<button name="@Html.NameFor(m => m.Button)" value="finish">Finish</button>
</form>
... 其他内容在这里
创造另一个
完成
单击按钮的值将解析为Pagemodel的button属性。根据该值,您可以决定如何进一步优化h
<form method="post">
... Other content goes here
<button name="@Html.NameFor(m => m.Button)" value="another">Create another</button>
<button name="@Html.NameFor(m => m.Button)" value="finish">Finish</button>
</form>
public async Task<IActionResult> OnPostAnotherAsync(int Number, int opwid)
{
if (!ModelState.IsValid)
{
return Page();
}
_context.OpwBids.Add(OpwBids);
await _context.SaveChangesAsync();
ViewData["Contractor"] = new SelectList(_context.Contractors, "Id", "ContractorName");
ModelState.SetModelValue("OpwBids.BidAmount", new ValueProviderResult(string.Empty, CultureInfo.InvariantCulture));
ModelState.SetModelValue("OpwBids.Contractor", new ValueProviderResult(string.Empty, CultureInfo.InvariantCulture));
return Page();
}