Forms 如何多次提交表单(asp.net core razor)

Forms 如何多次提交表单(asp.net core razor),forms,asp.net-core,razor-pages,Forms,Asp.net Core,Razor Pages,我正在尝试创建一个表单,可以使用不同的信息多次提交,同时在一个字段中保留一个公共值 我在ASP.NET Core Razor中的SQL表中有一个列表视图,它是一个建筑项目列表。对于列表中的每一行,我都有一个指向“创建”模板页面的链接,用户可以在该页面中为存储在不同表中的项目创建投标条目。项目编号指定给路线值(asp路线编号=“上一列表中的项目编号”),并填充“创建新投标”表单中的隐藏字段 使用razor页面的默认代码,一切都很好。单击“提交”并返回到项目列表 我想做的是在“创建新投标”表单上有另

我正在尝试创建一个表单,可以使用不同的信息多次提交,同时在一个字段中保留一个公共值

我在ASP.NET Core Razor中的SQL表中有一个列表视图,它是一个建筑项目列表。对于列表中的每一行,我都有一个指向“创建”模板页面的链接,用户可以在该页面中为存储在不同表中的项目创建投标条目。项目编号指定给路线值(asp路线编号=“上一列表中的项目编号”),并填充“创建新投标”表单中的隐藏字段

使用razor页面的默认代码,一切都很好。单击“提交”并返回到项目列表

我想做的是在“创建新投标”表单上有另一个选项,允许您保存并输入同一项目的另一个投标。我创建了另一个按钮和处理程序来实现这一点,但我仍然坚持实际实现它。如果我使用return Page(),表单将发布,页面将返回完整的路由数据,但文本字段仍包含以前的数据,下拉列表为空。如果我使用return-RedirectToPage(createnewpid,Route-data),表单将发布,但路由数据似乎没有传递,并创建空值错误

这是来自Projects列表(在foreach表中)的链接,它将带您进入“CreateBid”表单,并且运行良好

<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();
     }