Asp.net mvc 难以在post上重新填充viewmodels

Asp.net mvc 难以在post上重新填充viewmodels,asp.net-mvc,Asp.net Mvc,我有各种视图模型,它们的属性必须填充。例如,假设一个数据库表中充满了国家。我有一个创建用户页面,viewmodel上的一个属性是列出国家/地区 最初,我在一个无参数构造函数中填充了它,即 public CreateUserViewModel() { this.Countries = new CountryManager().GetCountries(); } 但我读到这是一个糟糕的做法,我应该通过他们 public CreateUserViewModel(IEnumerable<s

我有各种视图模型,它们的属性必须填充。例如,假设一个数据库表中充满了国家。我有一个创建用户页面,viewmodel上的一个属性是
列出国家/地区

最初,我在一个无参数构造函数中填充了它,即

public CreateUserViewModel()
{
   this.Countries = new CountryManager().GetCountries();
}
但我读到这是一个糟糕的做法,我应该通过他们

public CreateUserViewModel(IEnumerable<string> countries)
{
   this.Countries = countries;
}

我正在努力用谷歌搜索这可能是一个非常常见的问题。有什么想法吗?

不用在模型中填充这些静态数据,我们可以在视图本身中填充Dropdownlist值-

@Html.DropDownListFor(model => model.State, 
                      new SelectList(Utils.GetCountries()),
                      "value",
                      "text",
                      2)
其中Utils是一个Helper类,返回所有国家/地区


这种填充所有静态数据的方式(我指的是Dropdownlist或Listbox等的所有选项)将由视图接管,从而使模型不必保存此数据。

我们可以在视图本身中填充Dropdownlist值,而不是在模型中填充此静态数据-

@Html.DropDownListFor(model => model.State, 
                      new SelectList(Utils.GetCountries()),
                      "value",
                      "text",
                      2)
其中Utils是一个Helper类,返回所有国家/地区


这种填充所有静态数据的方式(我指的是Dropdownlist或Listbox等的所有选项)将被视图接管,从而使模型不必保存这些数据。

避免无参数构造函数的基本原理是控制反转。这种情况下的逻辑是,
Countries
是一个依赖项,通过将该依赖项外部化(从而将其注入到类中),可以使类不那么脆弱,并且更易于扩展

然而,我认为这实际上并不适用于您的场景,因为
国家
实际上不是您的类的依赖项,而是您的视图的依赖项。视图模型是为视图服务的,因此有点封闭和不可扩展。换句话说,对于服务、存储库、实用程序类等,确实要遵循控制反转,但对于视图模型来说,这并不是真正必要或重要的

总之,我是这样处理这类事情的:

public class FooViewModel
{
    ...

    // Countries is not initialize by a constructor
    public IEnumerable<SelectListItem> Countries { get; set; }
}

避免无参数构造函数背后的基本原理是控制反转。这种情况下的逻辑是,
Countries
是一个依赖项,通过将该依赖项外部化(从而将其注入到类中),可以使类不那么脆弱,并且更易于扩展

然而,我认为这实际上并不适用于您的场景,因为
国家
实际上不是您的类的依赖项,而是您的视图的依赖项。视图模型是为视图服务的,因此有点封闭和不可扩展。换句话说,对于服务、存储库、实用程序类等,确实要遵循控制反转,但对于视图模型来说,这并不是真正必要或重要的

总之,我是这样处理这类事情的:

public class FooViewModel
{
    ...

    // Countries is not initialize by a constructor
    public IEnumerable<SelectListItem> Countries { get; set; }
}

很酷,对于上面的例子,这确实非常有效。但是如果列表是特定于用户的呢?例如,可供用户选择的国家/地区。您是否有一个方法
Utils.GetCountriesForUser(this.Model.UserId)
?@SLC,是的,如果您的选项特定于用户类型,那么您应该在Utils类中有重载方法。很酷,这对于上面的示例非常有效。但是如果列表是特定于用户的呢?例如,可供用户选择的国家/地区。您是否有一个方法
Utils.GetCountriesForUser(this.Model.UserId)
?@SLC,是的,如果您的选项特定于用户类型,那么您应该在Utils类中有重载方法。您还可以阅读PRG模式(这可能会对解决方案产生影响)。您还可以阅读PRG模式(这可能会对解决方案产生影响)。