使用 ASP.NET MVC 将创建和编辑 ActionResults 合并为一个

Merging Create and Edit ActionResults into one using ASP.NET MVC

我目前有4种操作方法:

用户创建 - 获取
用户创建 - Post

用户编辑 - 获取
用户编辑 - Post

我的目标是以某种方式将它们组合起来做 UserEdit。两者之间的唯一区别是 UserCreate 在表单中要求输入 Password 和 ConfirmPassword。用户编辑没有。我最终不得不为此创建 2 个单独的 ViewModel:UserCreateViewModel、UserEditViewModel。

// GET: Users/Create
[Route("users/create")]
public IActionResult UserCreate()
{
    return View();
}

// POST: Users/Create
[Route("users/create")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UserCreate(UserCreateViewModel vm)
{        
}

// GET: Users/Edit/5
[Route("users/edit/{id}")]
public async Task<IActionResult> UserEdit(string id)
{
    return View(vm);
}

// POST: Users/Edit/5
[Route("users/edit/{id}")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UserEdit(UserEditViewModel vm)
{
    return View(vm);
}

如果让它们分开更好,更多的 MVC 约定很好,但我只是想确保没有我没有利用的 MVC 的某些功能可以帮助我只有 2 个 Action 方法,一个查看模型。

是的,您当然可以只有 2 个使用 mvc 功能的方法:

您可以创建一个方法来创建或编辑 GET 类型的用户

[HttpGet]
[Route("users/useraddoredit/{id?}")]
public async Task<IActionResult> UserEdit(string id)
{
  if(string.isNullorEmpty(id))
  {
    return View();
  }
  return View(vm);
}

您可以为 POST 类型创建一个方法。这里创建一个具有所有属性的新模型 UserViewModel。

[Route("users/edit/{id}/{isUserEdit?}")]
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> UserEdit(UserViewModel vm, bool isUserEdit)
{
    if(isUserEdit)
    {
       return View(vm);
    }    
    else
    {
        //logic for add user
    }
}

PS:但不推荐使用这种方式

将它们分开。可以这么说,您在 MVC 中没有遗漏任何用于工作 'around' 的东西。当然你可以让它工作,但它偏离了常见的 api 实现,因为认为它们是相似的动作。如果感觉真的很糟糕,你可以在页面和服务器端使用相同的视图模型和代码验证(你不能依赖它在模型上,因为验证现在需要一个模型的两个场景)但如果也将它分成二。更干净了。