0

我在“注册、配置文件和问题”上的 3 个不同控制器上有 3 个动作名称删除,它们都有动作删除方法。如何从我的注册删除方法中调用profile-delete 和 questions-delete。这样,当用户想要删除他们的帐户时,他们所要做的就是继续注册删除,而不是继续注册、个人资料和问题删除方法。我希望在 1 [HttpPost, ActionName("Delete")] (registration) 中调用其他 2 ActionName("Delete") 方法,因为我更喜欢人们在一个地方删除所有内容这可能吗?假设每个用户共享一个相同的唯一 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");
    }
4

1 回答 1

0

如果我理解您的问题,您是在要求从当前执行的操作方法中调用其他控制器的操作方法吗?你通常不会那样做。Controller的action方法的第一条规则是:任何action方法都不能超过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;
    }
}
}

这可以通过 100 种不同的方式实现。关键是将逻辑抽象到一个公共代码库或“域”中。在此示例中,我选择将该逻辑放在模型下的当前网站名称空间中作为快捷方式。

至于Delete()其他控制器上的其他方法,您只需调用 aQuestionsService.DeleteByUserId()ProfileDataService.DeleteByUserId()处理这些方法。您甚至可以跨域共享这些服务,如我上面所示。

于 2013-01-19T02:55:01.167 回答