0

MVC の DRY 原則に反する Create GET および POST アクションで同じコードを再利用しているため、MVC コードをより効率的にする方法について助けを求めています。

具体的には、EntityFramework を使用しており、ViewModel に次のコードを設定するコントローラーがあります。

public ActionResult Create()
    {

        var fileManagers = from x in db.UserProfiles
                            select x;

        var estimators = from x in db.UserProfiles
                                select x;

        var projectManagers = from x in db.UserProfiles
                            select x;

        var jobStatuses = from x in db.JobStatuses
                            select x;           

        JobViewModel viewModel = new JobViewModel
        {
            Job = new Job(),
            FileManagers = fileManagers.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList(),
            Estimators = estimators.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList(),
            ProjectManagers = projectManagers.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList()
        };

        return View(viewModel);
    }

私の POST 関数では、モデルの有効性を確認し、モデルが有効でない場合は同じコードを再度記述して ViewModel を再設定しています。これはhttp://の ASP.NET 音楽チュートリアルに示されています。 www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-5 .

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(Job job, string action)
    {

        if (ModelState.IsValid)
        {
            db.Jobs.Add(job);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        var fileManagers = from x in db.UserProfiles
                           select x;

        var estimators = from x in db.UserProfiles
                         select x;

        var projectManagers = from x in db.UserProfiles
                              select x;

        var jobStatuses = from x in db.JobStatuses
                          select x;

        JobViewModel viewModel = new JobViewModel
        {
            Job = job,
            FileManagers = fileManagers.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList(),
            Estimators = estimators.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList(),
            ProjectManagers = projectManagers.Select(x => new SelectListItem
            {
                Value = x.UserName,
                Text = x.FirstName + " " + x.LastName
            }).ToList()
        };

        return View(viewModel);

    }

誰かがこれを行うためのより良い方法を提案できますか? プロジェクトは非常に小さいため、別のORMレイヤーを追加しないことが望ましいです。

4

2 に答える 2

2

モデルの各グループに同じユーザーのセットを使用しているため、これは少し単純です。

var users = db.UserProfiles
.ToArray()
.Select(x => new SelectListItem
{
    Value = x.UserName,
    Text = x.FirstName + " " + x.LastName
});

var jobStatuses = from x in db.JobStatuses
                  select x;

JobViewModel viewModel = new JobViewModel
{
    Job = job,
    FileManagers = users.ToList(),
    Estimators = users.ToList(),
    ProjectManagers = users.ToList()
};

これをフォーム モデルとして使用している場合は、次のようにモデルを作成することもできます。

var viewModel = new JobViewModel
{
    Job = job,
    FileManagers = new SelectList(users, "Value", "Text", model.FileManager),
    Estimators = new SelectList(users, "Value", "Text", model.Estimator),
    ProjectManagers = new SelectList(users, "Value", "Text", model.ProjectManager)
};

もちろん、さまざまなリストが でSelectListあり、ロールごとに選択したユーザーに対応する文字列モデル プロパティがあると仮定します。選択リストを満たす 1 つのメソッドが必要であると仮定すると、次のようにすることができます。

[HttpGet]
public ActionResult YourActionName()
{
    var model = new JobViewModel
    {
        Job = job,
        FileManager = "some value",
        Estimator = "some value",
        ProjectManager = "some value"
    };

    PopulateModel(model);

    return View(model);
}

[HttpPost]
public ActionResult YourActionName(JobViewModel model)
{
    if(ModelState.IsValid)
    {
        // do something...
        return RedirectToAction("your success action");
    }

    PopulateModel(model);

    return View(model);
}

private void PopulateModel(JobViewModel model)
{
    model.FileManagers = new SelectList(users, "Value", "Text", model.FileManager);
    model.Estimators = new SelectList(users, "Value", "Text", model.Estimator);
    model.ProjectManagers = new SelectList(users, "Value", "Text", model.ProjectManager);
}
于 2013-09-04T05:01:45.663 に答える