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

本文关键字:合并 一个 ActionResults 编辑 NET ASP MVC 创建 使用 | 更新日期: 2024-09-21 01:52:22

我目前有4种操作方法:

用户创建-获取
用户创建-发布

UserEdit-获取
UserEdit-发布

我的目标是以某种方式将它们组合起来——只做UserEdit。两者之间唯一的区别是UserCreate在表单中要求Password和ConfirmPassword。UserEdit没有。我最终不得不为此创建两个独立的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中没有一些我没有使用的功能可以帮助我只有两个Action方法,一个视图模型。

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

将它们分开。可以说,MVC中并没有遗漏任何旨在"解决"这一问题的东西。当然你可以让它工作,但它偏离了通用api实现,因为你认为它们是类似的操作。如果感觉真的很糟糕,你可以在页面和服务器端使用相同的视图模型和代码验证(你不能依赖它在模型上,因为验证现在需要一个模型的两个场景),但如果也将其拆分为两个。它更干净。

是的,使用mvc功能的方法肯定只有2种:

您可以为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
    }
}

附言:但不建议使用这种方法。