如何将多个表单值绑定到一个属性中?

时间:2015-05-15 15:01:55

标签: c# asp.net asp.net-mvc-5 model-binding

我有3个输入名称:Field_Day,Field_Month,Field_Year。

一个看起来像这样的模型:

public class Model
{
  public string Field { get; set; }
}

如何将这3个表单值绑定到我的Field属性中(" 10.10.2015")?

修改

大多数答案建议更改我的视图模型。这是不可能的,因为我的模型是元模型。

public class MetaModel
{
  public string[] FieldValues { get; set; } // Select Multiple inputs can have more than one value
  public string ControlType { get; set; }
  ...
}

2 个答案:

答案 0 :(得分:2)

我倾向于在视图模型中执行以下操作:

public int Day { get; set; }
public int Month { get; set; }
public int Year { get; set; }

public DateTime Field
{
    get { return new DateTime(Year, Month, Day); }
    set
    {
        Day = value.Day;
        Month = value.Month;
        Year = value.Year;
    }
}

此代表的实体只有Field属性。因此,在您的表单中,您可以使用DayMonthYear属性,然后在重新映射到实体时,将Field属性设置为{视图模型上的{1}}属性,它会根据发布的内容自动填充。

我还建议在这里使用DateTime而不是字符串。它不仅可以使来回转换变得更加容易,而且无需进行大量的字符串解析,但是您可以以任何需要的格式表示日期,而不仅仅是字符串的一种静态格式。

答案 1 :(得分:1)

您将要创建另一个类,然后使用剃刀助手或手动命名您的输入元素

C#

public class ViewModel
{
 public Field Field { get; set; }
}

public class Field
{
 public string Day { get; set; }
 public string Month{ get; set; }
 public string Year{ get; set; }
} 

.cshtml

@model ViewModel

<form>
 <div>Field Day <input name="Field.Day" /></div>
 <div>Field Month <input name="Field.Month" /></div>
 <div>Field Year <input name="Field.Year" /></div>
</form>

name属性是asp.net mvc模型绑定器用于填充视图模型的内容。这就是为什么他们在那里有点扩展。