1

我的数据库中有一个名为 Field 的表和一个名为 FieldValue 的表。我的模型如下所示:

[Table("Field")]
public class Field
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int FieldId { get; set; }
    public string Value { get; set; }
}

[Table("FieldValue")]
public class FieldValue
{
    [Key]
    [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)]
    public int FieldValueId { get; set; }
    public int FieldId { get; set; }
    public string Value { get; set; }
}

我想将每个字段显示为标签,然后显示与该字段关联的每个 FieldValue 的文本框,但我不太确定如何处理这个问题。如果这很重要,我正在使用 MVC 4。

4

3 回答 3

1

您可以将连接的数组返回到视图模型类(未经语法/错别字测试):

public class ViewModel
{
    public KeyValuePair<string,string> Fields { get; set; }
}

var kvps = Fields.Join(FieldValues,
    f => f.FieldId,
    fv => fv.FieldId,
    (f, fv) => 
        new KeyValuePair<string,object>(f.Value, fv.Value)
    }).ToArray();
var viewModel = new ViewModel { Fields = kvps };

return View(viewModel);

然后在视图中,简单地遍历这些值:

@model MyNamespace.ViewModel

@foreach (var kvp in Model.Fields)
{
    <span class="field-label">@kvp.Key</span>
    <span class="field-value">@Html.TextBoxFor(_ => kvp.Value)</span>
}

如果你把它放在一个表单中,那么回发也应该可以正常工作(因为它使用TextBoxFor)。

于 2012-12-07T16:52:11.847 回答
0

不知道你想做什么,我不想做任何假设,但我觉得你可能走错了路。您可能知道的 MVC 具有强类型视图,因此您可以将视图“绑定”到有用的业务对象(例如 Person),然后使用类似的东西生成 HTML

Html.TextBoxFor(p => p.Name)

其中 p 是一个人

您正在尝试构建的那个东西似乎是实现这一目标的技巧。您不能只创建有意义的对象来保存您的信息,然后将它们传递给强类型视图吗?如果另一个页面具有相同的字段,则传递相同的对象。

于 2012-12-07T16:40:50.200 回答
0

这里的答案取决于您是否会知道您预先拥有多少个字段。

如果你这样做了,那么你应该创建一个强类型模型来绑定你的 mvc 视图,并使用如下数据注释:

public class MyModel
{
    [Display(Name="Field name 1")
    public string Field1 { get; set; }

    [Display(Name="Field name 2")
    public string Field2 { get; set; }
}

然后在您看来,您可以使用以下代码:

@Html.LabelFor(model => model.Field1)
@Html.TextBoxFor(model => model.Field1)

@Html.LabelFor(model => model.Field1)
@Html.TextBoxFor(model => model.Field1)

但是,如果您不知道前面的字段数量,因此无法填充这样的强类型模型,那么我建议您执行以下操作:

  • 向字段添加导航属性,以便您可以轻松获取值
  • 编写一些代码以在数据库之间映射到可能的字典
  • 在您的视图中编写一个循环并使用这样的老式 html 助手:

...

@for (var key in model.FieldDictionary.Keys)
{
    @Html.Label("key", model.FieldDictionary(key))
    @Html.TextBox(model.FieldDictionary(key))
}

请注意,此代码未经测试,在第二个示例中,您必须弄清楚如何在发布表单时重新获取数据,但希望能给您一个起点。

希望这可以帮助!

于 2012-12-07T16:52:30.270 回答