c# - 在 GET/POST 上为 ViewModel 填充 SelectList 的最佳方法

标签 c# asp.net-mvc asp.net-mvc-3 code-reuse

我有以下 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/

相关文章:

c# - 使用 MVVM 和 Message 在 Windows Store 中编辑 XML

css - 单声道无法提供 css 文件 [错误] 命令失败 : failed to send file (file data)

asp.net-mvc - 在jqGrid中编辑或添加时隐藏列并显示字段

asp.net-mvc - ASP.NET MVC 3 确定 session 状态(新的或超时)

asp.net-mvc-3 - 覆盖 OnActionExecuting 以测试请求用户是否授权调用操作?

c# - 如何通过标记以编程方式设置 NavigationView.SelectedItem

c# - 无法确定类型为 'Npgsql.NpgsqlFactory' 的提供程序工厂的提供程序名称

c# - Linq Where条件匹配数组

asp.net - 覆盖默认的 ASP.Net MVC 脚手架 HTML

c# - Windows RT - 按钮单击事件是否在 UI 线程上执行?