Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在ASP.NET核心MVC中提交动态数量的字符串输入_C#_Jquery_Ajax_Asp.net Core - Fatal编程技术网

C# 如何在ASP.NET核心MVC中提交动态数量的字符串输入

C# 如何在ASP.NET核心MVC中提交动态数量的字符串输入,c#,jquery,ajax,asp.net-core,C#,Jquery,Ajax,Asp.net Core,我的应用程序中有一个页面,允许用户对数据库运行存储过程,这样他们就可以在不使用SSM的情况下管理数据或进行更改。使用SqlCommandBuilder.DeriveParameters方法,我能够成功地获取和显示select标记中的所有存储过程,以及显示它们的输入和输出参数 以下是合同类: public class DatabaseUpdateModel { public int ClientId { get; set; } public string StoredProcedu

我的应用程序中有一个页面,允许用户对数据库运行存储过程,这样他们就可以在不使用SSM的情况下管理数据或进行更改。使用
SqlCommandBuilder.DeriveParameters
方法,我能够成功地获取和显示select标记中的所有存储过程,以及显示它们的输入和输出参数

以下是合同类:

public class DatabaseUpdateModel
{
    public int ClientId { get; set; }
    public string StoredProcedureName { get; set; }
    public List<SelectListItem> StoredProcedureNames { get; set; }
    public Dictionary<string, SqlParamCollection> StoredProcedures { get; set; }
    public Dictionary<int, string> ParameterInputs { get; set; }


    public DatabaseUpdateModel()
    {
        StoredProcedureNames = new List<SelectListItem>();
        StoredProcedures = new Dictionary<string, SqlParamCollection>();
        ParameterInputs = new Dictionary<int, string>();
    }
}
当选择存储过程时,通过Ajax执行步骤2

 public DatabaseUpdateModel GetDatabaseUpdateProcedureParameters(string connectionString, string storedProcedureName)
    {
        _logger.LogTrace("Begin GetDatabaseUpdateProcedureParameters service method");
        SqlConnection connection = new SqlConnection(connectionString);
        DBConnectionSetter.SetDBConnection(_SqlHelper, connectionString);
        DatabaseUpdateModel model = GetDatabaseUpdateStoredProcedureNames(connectionString);
        connection.Open();

        Contract.Shared.SqlParamCollection collection = new Contract.Shared.SqlParamCollection();
        SqlCommand command = new SqlCommand();
        command.Connection = connection;
        command.CommandText = storedProcedureName;
        command.CommandType = CommandType.StoredProcedure;
        SqlCommandBuilder.DeriveParameters(command);
        foreach (SqlParameter param in command.Parameters)
        {
            if (param.Direction == ParameterDirection.Input)
            {
                collection.InputParameters.Add($"{param.ParameterName} - {param.SqlDbType}");
                collection.SqlParameters.Add(param);
            }
            else
            {
                collection.OutputParameters.Add($"{param.ParameterName} - {param.SqlDbType}");
            }
        }

        model.StoredProcedures.Add(storedProcedureName, collection);
        connection.Close();
        return model;
    }
这给我留下的是:

现在,我一直在关注各种文章和参考资料以达到这一点,但现在我遇到了一些问题,即如何将这些输入正确地绑定到一个模型,以便通过操作或通过ajax提交。下面是我在视图中的当前代码(注释掉的行是我最新的尝试之一)

我的假设,以及到目前为止我阅读的所有内容都表明,我应该能够简单地使用name属性来表示字典的键,并且标记中的值将对应于表单提交时输入的值。然而,我所有的尝试都遇到了错误(例如,字典中没有索引)


如何通过控制器操作或ajax实现这一点?

我想提出这个问题,这样如果有更了解这一点的人发现了它,我可能会获得一些见解,从而节省我更多的时间。在阅读了一个链接后,我发现我在HTML的呈现方式中遗漏了一个关键部分,并提出了类似这样的方法,现在可以正确地在输入中发布值。我仍然需要处理和处理模型中其他缺失的部分,但至少这让我得到了前进所需的东西

下面是相关的代码,允许这项工作。创建一个隐藏的输入来单独存储ID,并允许用户输入字符串值,这似乎完全符合我的预期

<td>
  <ul>
    @if (!string.IsNullOrEmpty(Model.StoredProcedureName))
    {
       for (int i = 0; i < Model.StoredProcedures[Model.StoredProcedureName].InputParameters.Count(); i++)
       {
         <li>
              @Model.StoredProcedures[Model.StoredProcedureName].InputParameters[i].ToString()<br />
              <input hidden id="databaseUpdateParamKey[@i]" name="ParameterInputs[@i].Key" value="@i" />
              <input id="databaseUpdateParamValue[@i]" name="ParameterInputs[@i].Value" type="text" />
         </li>
        }
     }
  </ul>
</td>

    @如果(!string.IsNullOrEmpty(Model.StoredProcedureName)) { 对于(int i=0;i @Model.StoredProcedures[Model.StoredProcedureName].InputParameters[i].ToString()
    } }

我想把这个问题提出来,这样如果有更有知识的人发现了这个问题,我也许可以获得一些见解,省得自己花更多的时间挠头。在阅读了一个链接后,我发现我在HTML的呈现方式中遗漏了一个关键部分,并提出了类似这样的方法,现在可以正确地在输入中发布值。我仍然需要处理和处理模型中其他缺失的部分,但至少这让我得到了前进所需的东西

下面是相关的代码,允许这项工作。创建一个隐藏的输入来单独存储ID,并允许用户输入字符串值,这似乎完全符合我的预期

<td>
  <ul>
    @if (!string.IsNullOrEmpty(Model.StoredProcedureName))
    {
       for (int i = 0; i < Model.StoredProcedures[Model.StoredProcedureName].InputParameters.Count(); i++)
       {
         <li>
              @Model.StoredProcedures[Model.StoredProcedureName].InputParameters[i].ToString()<br />
              <input hidden id="databaseUpdateParamKey[@i]" name="ParameterInputs[@i].Key" value="@i" />
              <input id="databaseUpdateParamValue[@i]" name="ParameterInputs[@i].Value" type="text" />
         </li>
        }
     }
  </ul>
</td>

    @如果(!string.IsNullOrEmpty(Model.StoredProcedureName)) { 对于(int i=0;i @Model.StoredProcedures[Model.StoredProcedureName].InputParameters[i].ToString()
    } }

\@Seabizkit是的,我看到了那篇文章,并尝试了一些非常类似的东西。我尝试将我的字典从更改为,并多次更改我的输入标记帮助器,以尝试获得提交的值。我现在正在阅读链接的博客帖子。@Seabizkit我觉得自己像个白痴。把我的答案贴在下面。很高兴你把它整理好了,是的,我可以帮你做,但是当你和它斗争的时候,你学到了很多,然后你发现了你喜欢的东西,我只是想让你知道你有一个链接来跟踪某个东西,我记得当我在10年前试图发现这个问题的时候。。。为什么更少的链接,我也尝试了无数种方式。一旦你知道它是如何工作的,你就可以对绑定到其他动态类型列表进行建模了……是的,这是我偶然发现的第一个链接之一。我在阅读之前把问题写了下来,因为这是我在过去一两天里一直在努力解决的问题\@Seabizkit是的,我看到了那个帖子,并尝试了一些非常类似的东西。我尝试将我的字典从更改为,并多次更改我的输入标记帮助器,以尝试获得提交的值。我现在正在阅读链接的博客帖子。@Seabizkit我觉得自己像个白痴。把我的答案贴在下面。很高兴你把它整理好了,是的,我可以帮你做,但是当你和它斗争的时候,你学到了很多,然后你发现了你喜欢的东西,我只是想让你知道你有一个链接来跟踪某个东西,我记得当我在10年前试图发现这个问题的时候。。。为什么更少的链接,我也尝试了无数种方式。一旦你知道它是如何工作的,你就可以对绑定到其他动态类型列表进行建模了……是的,这是我偶然发现的第一个链接之一。我在阅读之前把问题写了下来,因为这是我在过去一两天里一直在努力解决的问题
function selectDatabaseUpdateStoredProcedure(clientId, storedProcedureName) {
    var selected = $("#clientStoredProcedurePicker option:selected").val();
    console.log(selected); // Selected Stored Procedure Name
    $.ajax({
        url: "/Process/GetDatabaseUpdateProcedureParameters?ClientId=" + clientId + "&StoredProcedureName=" + storedProcedureName,
        success: function (data) {
            console.log(data);
            $("#summaryTableDiv").html(data);
        }
    });
}
<td>
  <ul>
    @if (!string.IsNullOrEmpty(Model.StoredProcedureName))
    {
       for (int i = 0; i < Model.StoredProcedures[Model.StoredProcedureName].InputParameters.Count(); i++)
       {
         <li>
              @Model.StoredProcedures[Model.StoredProcedureName].InputParameters[i].ToString()<br />
              <input hidden id="databaseUpdateParamKey[@i]" name="ParameterInputs[@i].Key" value="@i" />
              <input id="databaseUpdateParamValue[@i]" name="ParameterInputs[@i].Value" type="text" />
         </li>
        }
     }
  </ul>
</td>