Asp.net mvc 3 MVC3删除操作名称全部

Asp.net mvc 3 MVC3删除操作名称全部,asp.net-mvc-3,if-statement,actionresult,Asp.net Mvc 3,If Statement,Actionresult,我在3个不同的控制器上删除了3个动作名称,它们位于“注册、配置文件和问题”上,它们都有动作删除方法。如何从注册删除方法中调用配置文件删除和问题删除。这样,当用户想要删除他们的帐户时,他们所要做的就是继续注册删除,而不是继续注册、配置文件和问题删除方法。我想在1[HttpPost,ActionName(“Delete”)](注册)中调用其他2个ActionName(“Delete”)方法,因为我更喜欢人们在一个地方删除所有内容。这可能吗?假设每个用户共享一个唯一的ID,该ID在所有用户中都是相同的

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

如果我理解您的问题,您是否要求从当前执行的操作方法调用其他控制器的操作方法?您通常不会这样做。控制器操作方法的第一条规则是:任何操作方法的代码都不应超过10行。基本上,action方法应该是一个简单的方法来收集视图,或者在域中调用action,然后返回

换句话说,SRP模式:

相反,您应该为这些重复代码组织您的域逻辑(您所描述的被认为是域模型逻辑,而不是控制器逻辑),例如在这里删除问题,但当用户被删除时,也会删除问题,等等

// 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");
}
注意这个动作方法有多干净。它只需要一行或两行代码,以及一大堆退出路径就可以在许多不同的情况下正确处理用户体验

现在,您的域逻辑可以封装到服务(或提供程序,或类似内容)中:

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


至于其他控制器上的其他
Delete()。您甚至可以在整个域内共享这些服务,正如我上面所示。

哦,好的,非常感谢您,我会这样做的,我一直在努力解决这个问题。谢谢请注意,我禁止在控制器和服务之间共享DataContext。标准的IoC实践将DataContext的相同实例注入控制器以及被调用的服务。还有许多其他的方法,例如工作单元模式也可以传递到服务中。每个人都有自己的答案。在我的答案中大约有5种不同的模式。LOL.对不起,再多读一点关于工作单元和/或IOC、SRP和域服务等的内容。
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;
    }
}
}