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