You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6下ASP.NET Core Web App动态表单值传递至OnPost的方法

在.NET 6 ASP.NET Core中处理动态表单提交的方法

针对动态生成表单、无法提前定义绑定模型的场景,以下是几种实用的实现方式:

方法1:直接读取Request.Form集合

在OnPost处理程序中,直接通过Request.Form获取所有提交的表单字段,再按你定义的Param1、Param2等前缀筛选目标字段:

public IActionResult OnPost()
{
    var formValues = new Dictionary<string, object>();
    
    // 遍历表单字段,筛选Param开头的键
    foreach (var key in Request.Form.Keys)
    {
        if (key.StartsWith("Param", StringComparison.OrdinalIgnoreCase))
        {
            var value = Request.Form[key];
            formValues[key] = ParseFormValue(value, key);
        }
    }
    
    ViewBag.SubmittedValues = formValues;
    return Page();
}

// 辅助方法:根据字段类型解析值
private object ParseFormValue(string value, string paramName)
{
    // 复用OnGet阶段记录的字段类型(比如存在ViewBag.ParamTypes中)
    if (ViewBag.ParamTypes is Dictionary<string, Type> paramTypes && paramTypes.TryGetValue(paramName, out var type))
    {
        if (type == typeof(bool))
        {
            // 复选框提交值为"on",转布尔类型
            return !string.IsNullOrEmpty(value);
        }
        else if (type == typeof(DateTime))
        {
            DateTime.TryParse(value, out var date);
            return date;
        }
        else if (type == typeof(int))
        {
            int.TryParse(value, out var num);
            return num;
        }
    }
    
    // 默认返回字符串
    return value;
}

OnGet阶段生成表单时,需要记录字段类型用于后续转换:

public void OnGet()
{
    // 模拟动态生成的字段列表
    var dynamicFields = new List<(string Name, string Type, string Label)>
    {
        ("Param1", "text", "用户名"),
        ("Param2", "date", "注册日期"),
        ("Param3", "checkbox", "同意协议")
    };
    
    ViewBag.DynamicFields = dynamicFields;
    
    // 存储每个字段对应的CLR类型
    var paramTypes = new Dictionary<string, Type>
    {
        {"Param1", typeof(string)},
        {"Param2", typeof(DateTime)},
        {"Param3", typeof(bool)}
    };
    ViewBag.ParamTypes = paramTypes;
}

对应的Razor视图片段:

<form method="post">
    @foreach (var field in ViewBag.DynamicFields as List<(string Name, string Type, string Label)>)
    {
        <div class="form-group">
            <label>@field.Label</label>
            @if (field.Type == "text")
            {
                <input type="text" name="@field.Name" class="form-control" />
            }
            else if (field.Type == "date")
            {
                <input type="date" name="@field.Name" class="form-control" />
            }
            else if (field.Type == "checkbox")
            {
                <input type="checkbox" name="@field.Name" />
            }
        </div>
    }
    <button type="submit" class="btn btn-primary">提交</button>
</form>

@if (ViewBag.SubmittedValues != null)
{
    <h3>提交结果</h3>
    <ul>
        @foreach (var kvp in ViewBag.SubmittedValues as Dictionary<string, object>)
        {
            <li>@kvp.Key: @kvp.Value (@kvp.Value.GetType().Name)</li>
        }
    </ul>
}

方法2:使用IFormCollection作为参数

MVC支持直接将IFormCollection作为OnPost参数,写法更简洁:

public IActionResult OnPost(IFormCollection form)
{
    var formValues = new Dictionary<string, object>();
    
    foreach (var key in form.Keys.Where(k => k.StartsWith("Param")))
    {
        var value = form[key];
        formValues[key] = ParseFormValue(value, key);
    }
    
    ViewBag.SubmittedValues = formValues;
    return Page();
}

// 复用之前的ParseFormValue辅助方法

方法3:绑定到Dictionary<string, string>

如果不需要立即转换类型,可直接绑定到字典,后续再处理类型转换:

public IActionResult OnPost(Dictionary<string, string> formData)
{
    var filteredValues = formData.Where(kvp => kvp.Key.StartsWith("Param"))
                                .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    
    ViewBag.SubmittedValues = filteredValues;
    return Page();
}

注意事项

  • 表单字段的name属性必须严格匹配Param1、Param2等命名,否则无法正确获取值。
  • 复选框未勾选时不会提交值,处理时需判断键是否存在,或默认设为false。
  • 日期、整数等类型需手动转换,因为表单提交的都是字符串,依赖OnGet阶段记录的字段类型做解析。

内容的提问来源于stack exchange,提问作者Ed R.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 02:03:58