【发布时间】:2018-07-20 18:04:17
【问题描述】:
我目前正在编写一个程序,该程序根据主键比较来自多个数据库的数据(我正在使用 VS17 和使用 C# razor pages 和 HTML 的 MVC 架构)。为了简短起见,我的程序显示来自多个数据库中同一个表的数据字段(理论上是不同数据库之间存在不匹配的记录),我使用主键进行比较。我将它们显示为单选按钮,以便用户可以选择正确的值,然后相应地更新数据库。
我发布表单数据并使用模型绑定,以便我可以创建发送到我的控制器的项目列表。这是因为我正在向控制器发送不同数量的数据,因此它们必须具有相同的名称才能使模型绑定正常工作(或者至少据我所知)。
我遇到的问题是我认为这个特定的代码:
@for (int x = 0; x < Model.ContextTables.Count(); x++)
{
for (int y = 0; y < Model.ContextTables[x].Count(); y++)
{
if (Model.ContextTables[0][y] != Model.ContextTables[x][y])
{
if (x == 1)
{
<h5>Column: @Model.Columns[y]</h5>
<input name="Update_Columns" id="Update_Columns" type="hidden" value=@Model.Columns[y]>
<text>@Model.DBNames[0]:   </text><input type="radio" name="Records" value="@Model.ContextTables[0][y]" checked="checked"> @Model.ContextTables[0][y] <br />
}
<text>@Model.DBNames[x]:   </text><input type="radio" name="Records" value="@Model.ContextTables[x][y]" > @Model.ContextTables[x][y] <br />
}
}
}
基本上它的工作原理是,如果有 2 个(或更多)列不匹配,它会创建更多单选按钮集。
例如,假设我们有主键“堆栈溢出”,并且在 2 个数据库之间,变量“C#”和“HTML”是不同的。我的网页或多或少是这样的:
主键:堆栈溢出
差异:
C#
t1-“值 1” t2-“值 2”
HTML
t1-"值 1" t2-“值2”
使用单选按钮,其中 - 字符位于值旁边。当只有一个不匹配的列时,这种方法有效,但是当有 2 个或更多时,我只能从所有列表中选择 1 个单选按钮(这不是故意的,但我知道这是因为所有列表的“名称”我的单选按钮是一样的)。
预期的性能是每列都有自己单独的一组单选按钮,但它们大多数都被发布为与创建列表相同的名称(正如我上面提到的)。这是因为如果没有列表,Action 方法就不能接受无限变化的输入。
例如,如果我选择 C#、value1 和 HTML、value1,预期结果是都映射到名称为“Records”的表单数据,这样 Records[0] 将从 C# 列输出 value1,而 Records[1 ] 在控制器中使用时会从 HTML 列中输出 value1。
我本质上要求的是帮助/修复,无论是使用 C#、Javascript、J-Query 还是 HTML 本身(无法使用 PHP)来解决这个问题。
我意识到这可能看起来很杂乱无章,但我已经为整个项目工作了大约一个半星期,我的大脑完全被烧毁了。如果我能做些什么来提供额外的清晰度,我会非常乐意。谢谢!
【问题讨论】:
-
该死的。使用 WP、MVVM 和它的模板,这将非常容易。我只能想到两种方法: 1. 标签。所有 WinForms 控件都有一个“Tag”属性,可以接受任何对象。甚至处理程序也需要进行一些转换才能从发送者发送者那里得到它,但在这种情况下它可以帮助识别。 2. 动态生成这些按钮。将数组与数据的引用一起存储。
-
你永远不会让它与你当前的实现一起工作(至少不是没有黑客)。所有这些条件代码都属于您的控制器,而不是视图。创建一个视图模型来表示您的数据并使用
HtmlHelper方法对其进行强绑定。 -
如果你想知道这个问题的答案,请展示你的控制器方法(GET 和 POST)和你传递给视图的模型。
标签: c# html asp.net-mvc radio-button model-binding