asp中的表单提交

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp中的表单提交相关的知识,希望对你有一定的参考价值。

我做了一个用户填写的表单页,用什么方法才能把用户填写的数据收集回来?最好是通过不用安装注册组件的邮件形式。我是新手不太懂,麻烦把代码写给我,多谢。mailto之类的就不用回答了
表单部分代码如下:
<form action="...." method="post" enctype="text/plain" name="body" id="LP">
<table width="99%" border="0" cellspacing="0" cellpadding="4">
<tr >
<th width="4%" align="center" bgcolor="#CCCCCC" class="link_12_lan"></th>
<th height="22" colspan="2" align="center" bgcolor="#CCCCCC" class="link_12_lan"><div align="center">推荐项目</div></th>
</tr>
<tr>
<td> </td>
<td width="24%" align="right">企业名称:</td>
<td width="72%"><label>
<input name="mingcheng" type="text" id="mingcheng" size="40" maxlength="40"/>
</label></td>
</tr>
<tr>
<td> </td>
<td align="right" valign="middle">主营业务:</td>
<td><label>
<textarea name="yewu" cols="38" rows="3" id="yewu"></textarea>
</label></td>
</tr>
.........
<tr>
<td> </td>
<td align="right" valign="middle">附件上传:</td>
<td><label>
<input name="file" type="file" size="60" />
</label></td>
</tr>
<tr>
<td> </td>
<td colspan="2" align="center" valign="middle"><label>
<input type="submit" name="Submit" value="提交" />    
<input type="reset" name="Submit2" value="重置" />
</label></td>
</tr>
</table>
</form>

无语,你好像还没入门,如果没法像你说的“收集” 那就不能称之为动态了。不要像有些人说的一样,会动的,有动画动的页面叫动态页面,那样说出去太丢人了。 参考技术A 写入数据库就OK了.

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

【中文标题】如何多次提交表单(asp.net core razor)【英文标题】:How to submit a form multiple times (asp.net core razor) 【发布时间】:2021-03-13 19:16:54 【问题描述】:

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

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

使用剃须刀页面的默认代码,一切正常。您单击提交并返回到项目列表。

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

这是项目列表中的链接(在 foreach 表内),它会将您带到“创建投标”表单并且工作正常。

<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"/>

还有处理程序:

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

我还在“重定向到页面”中的路由参数(而不是使用变量)中尝试了几件事,但似乎没有任何效果。

有没有更简单的方法,还是我错过了什么?

这是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");

这是 C# 文件:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Authorization_AD.Models;

namespace Authorization_AD.Pages.GenSvc.BidEntry

    public class CreateBidModel : PageModel
    
        private readonly Authorization_AD.Models.OPWContext _context;

        public CreateBidModel(Authorization_AD.Models.OPWContext context)
        
            _context = context;
        

        public IActionResult OnGet()
        
        ViewData["Contractor"] = new SelectList(_context.Contractors, "Id", "ContractorName");
        ViewData["OpwProject"] = new SelectList(_context.MainProjectsListing, "Id", "ProjectNumber");
            return Page();
        

        [BindProperty]
        public OpwBids OpwBids  get; set; 

        public async Task<IActionResult> OnPostDoneAsync()
        
            if (!ModelState.IsValid)
            
                return Page();
            

            _context.OpwBids.Add(OpwBids);
            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        

        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 == OpwBids.OpwProjectNavigation.ProjectNumber, opwid == OpwBids.OpwProject));
        
    

【问题讨论】:

您能谈谈您的具体需求吗?你需要达到什么目标?在 Create 页面上创建多个 OpwBids? 如果可以的话,您可以发布您的创建页面的代码。 我想要的是一个底部有两个按钮的表单。一个是“保存并退出”,另一个是“保存并创建另一个”,它创建数据库记录,重新加载相同的表单并记住预先填充到隐藏字段中的项目编号。 【参考方案1】:

您可以向您的页面添加一个属性,该属性将用于绑定单击按钮的值。

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

您需要向视图添加两个具有相同名称的按钮,并且该值将映射到 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属性。根据该值,您可以决定如何进一步处理请求的响应(在您的情况下完成/创建另一个)。

【讨论】:

【参考方案2】:

感谢大家的帮助。通过将以下内容添加到“OnPostAnotherAsync”任务中,我得到了它做我想做的事情:

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

在“保存更改”之后,我需要重新加载“承包商”下拉列表的视图数据。那么只需要在返回页面之前清除表单字段即可。

【讨论】:

以上是关于asp中的表单提交的主要内容,如果未能解决你的问题,请参考以下文章

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

表单有哪几种提交方式?不同提交方式中asp程序如何获取表单中的参数?

ASP.NET MVC 4 一键为每个订单提交 2 个表单

ASP.NET MVC 表单提交多层子级实体集合数据到控制器中

asp 提交表单和上传文件

asp.net提交表单到数据库中的中文数据是一些问号