我在3个不同的控制器上有3个动作名称删除“注册,个人资料和问题”他们都有动作删除方法。如何从我的注册 - 删除方法中调出个人资料 - 删除和问题 - 删除。这样,当用户想要删除他们的帐户时,他们只需要进行注册 - 删除而不是继续注册,配置文件和问题删除方法。我希望在1 [HttpPost,ActionName(“删除”)] (注册)中调出其他2个ActionName(“删除”)方法,因为我更喜欢人们在一个地方删除所有内容这是可能的?假设每个用户共享一个相同的唯一ID。我只是用来说明任何帮助的代码中的注释会很棒
注册 - 删除
[HttpPost, ActionName("Delete")]
public ActionResult DeleteConfirmed()
{
var ss = User.Identity.Name;
var getid = (from s in db.registration where ss == s.email select s.RegistrationID).FirstOrDefault();
registration registration = db.registration.Find(getid);
//This delete's the registration
db.buyers.Remove(registration);
// How can i call-out profile-delete actionname here and questions-delete like
//if (question-delete != null){
// include ActionResult deleteconfirmed("question-delete" }
db.SaveChanges();
return RedirectToAction("logout");
}
答案 0 :(得分:0)
如果我理解你的问题,你要求从当前执行的动作方法调用其他控制器的动作方法?你通常不会这样做。 Controller的动作方法的第一条规则是:没有动作方法应该超过10行代码。基本上,一个动作方法实际上应该是一个简单的方法来收集视图,或在您的域中调用一个动作,然后返回。
换句话说,SRP模式: http://codebetter.com/karlseguin/2008/12/05/get-solid-single-responsibility-principle/
相反,你会为这个重复的代码组织你的域逻辑(你所描述的被认为是域模型逻辑,而不是控制器逻辑),例如在这里删除问题,但是当用户被删除时也删除问题等。
// an example of IOC injection of your IUserService
private IUserService
public RegistrationController(IUserService userService)
{
_userService = userService;
}
[HttpPost]
public ActionResult Delete()
{
// insert modelstate and/or validation logic
//
if (User.Identity.IsAuthenticated == false)
{
return RedirectToAction("index", "Home");
}
// good practice to never bubble up exceptions to users
try
{
if (_userService.DeleteByEmail(User.Identity.Name) == false)
{
ModalState.AddModelError(String.Empty, "Not allowed?");
return View();
}
// save it all in a single atomic operation here to keep it all in
// a single Transaction Scope that will rollback properly if there is
// an error.
//
db.SaveChanges();
}
catch (Exception)
{
ModalState.AddModelError(String.Empty, "An error occurred...");
return View();
}
// all ok!
return RedirectToAction("logout");
}
请注意此操作方法的清洁程度。它只需要一行代码或两行代码,以及一大堆退出路径,以便在许多不同情况下正确处理用户体验。
现在,您的域逻辑可以封装到服务(或提供者,或类似的)中:
namespace MyWebsite.Models
{
public class UserService : IUserService
{
// Todo: convert to some IoC lovin'
//
public Boolean DeleteByEmail(String email)
{
var user =
(from user in db.Registrations
where
user.Email == email
select s).FirstOrDefault();
if (user == null)
return false;
// call into other services to delete them
ProfileDataService.DeleteByUserId(user.UserId);
QuestionsService.DeleteByUserId(user.UserId);
// finally, delete the user
db.Registrations.Delete(user);
// note, I am NOT calling db.SaveChanges() here. Look
// back at the controller method for the atomic operation.
//
return true;
}
}
}
这可以通过不同的方式实现。关键是将该逻辑抽象为公共代码库或“域”。我选择将该逻辑放在模型下的当前网站命名空间中作为此示例中的快捷方式。
至于其他控制器上的其他Delete()
方法,您只需调用QuestionsService.DeleteByUserId()
和ProfileDataService.DeleteByUserId()
来处理这些方法。您甚至可以在域中共享这些服务,如上所示。