C# 如何在ASP.NET核心MVC中提交动态数量的字符串输入
我的应用程序中有一个页面,允许用户对数据库运行存储过程,这样他们就可以在不使用SSM的情况下管理数据或进行更改。使用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
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>