我有以下 View 模型:
public class EditViewModel
{
public int FooType { get; set; }
public IEnumerable<SelectListItem> FooTypes { get; set; }
}
我最初像这样在我的编辑操作中填充它:
public ActionResult Edit(int id)
{
EditViewModel model = new EditViewModel();
model.FooTypes = new SelectList(repository.GetFooTypes(), "Id", "Value");
return View(model);
}
当我创建用于发布值的操作时,我必须重复相同的代码:
public ActionResult Edit(int id, EditViewModel model)
{
if( !ModelState.IsValid )
{
model.FooTypes = new SelectList(repository.GetFooTypes(), "Id", "Value");
return View(model);
}
return RedirectToAction("Index");
}
我不喜欢将此代码放在两个不同的位置。是否有任何常见的做法可以将它重构到一个位置,这样我就不需要重复这段代码?
最佳答案
鉴于 C# 是一种面向对象的语言,因此有很多选项可用。
最简单的方法是将它包装在 Controller 中的一个方法中:
private SelectList GetFooTypesList()
{
return new SelectList(repository.GetFooTypes(), "Id", "Value);
}
并在设置模型时调用它
或者如果您在多个类中使用它,您可以在另一个接受存储库或 IEnumerable 作为参数的类中创建一个辅助方法。
如果你想获得真正的高级,你可以使用 ModelFactory 为你创建 FooType 模型,使用预填充的 FooType 属性,这样 Controller 根本不需要担心它。
有很多选择,您只需要选择最适合您的。
我个人的偏好是 Controller 中的简单辅助方法。
关于c# - 在 GET/POST 上为 ViewModel 填充 SelectList 的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7603519/