使用 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 实现,因为认为它们是相似的动作。如果感觉真的很糟糕,你可以在页面和服务器端使用相同的视图模型和代码验证(你不能依赖它在模型上,因为验证现在需要一个模型的两个场景)但如果也将它分成二。更干净了。
我目前有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 实现,因为认为它们是相似的动作。如果感觉真的很糟糕,你可以在页面和服务器端使用相同的视图模型和代码验证(你不能依赖它在模型上,因为验证现在需要一个模型的两个场景)但如果也将它分成二。更干净了。