Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MVC4如何从一个控制器发布到另一个控制器_C#_Asp.net Mvc_Asp.net Mvc 4 - Fatal编程技术网

C# MVC4如何从一个控制器发布到另一个控制器

C# MVC4如何从一个控制器发布到另一个控制器,c#,asp.net-mvc,asp.net-mvc-4,C#,Asp.net Mvc,Asp.net Mvc 4,我可以使用Get和RedirectToAction来做这件事,但不知道为什么我不能使用Post来做? 我在订阅服务器控制器中,希望从CreateTest控制器返回一个视图。 当它返回时,它假定我仍然在订阅服务器中,并且不查看控制器视图 public class SubscriberController : Controller { [HttpPost] [ValidateAntiForgeryToken] public ActionResult CreateTestPor

我可以使用Get和RedirectToAction来做这件事,但不知道为什么我不能使用Post来做? 我在订阅服务器控制器中,希望从CreateTest控制器返回一个视图。 当它返回时,它假定我仍然在订阅服务器中,并且不查看控制器视图

public class SubscriberController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateTestPortal()
    {
        CreateTestController ctc = new CreateTestController();
        return ctc.CreateTestPortal();
    }
}

public class CreateTestController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult CreateTestPortal()
    {
            //... validation logic
        var vm = new CBT.Models.CreateTest.CreateTestPortal();              
            //... build form logic
        return View(vm);
    }
}   
如果我从订阅服务器中的CreateTestPortal进行此调用

return RedirectToAction("CreateTestPortal", "CreateTest");
它正确地返回表单,但我必须使用GET方法并失去ValidateAntiForgeryToken的安全性。这是默认行为还是我遗漏了一个步骤


我正在使用MVC4,如果您正在调用另一个控制器操作或重定向,则不能使用HTTPPost属性。当您发布时,这是由用户完成的,您使用重定向或调用的操作不是post。当您有一个用HttpPost修饰的操作,并用GET调用它时,它会显示一个错误,就好像该对象不存在一样。为了使这项工作,你应该在你的服务器上手工制作一个post请求。。。这是一种黑客行为

在本例中,您可以将控制器操作的内容放在助手方法中,并从两个操作调用该方法


这样,您可以在每个操作中保留其
HTTPPost
ValidateAntiForgeryToken
属性。

如果您正在调用另一个控制器操作或重定向,则不能使用HTTPPost属性。当您发布时,这是由用户完成的,您使用重定向或调用的操作不是post。当您有一个用HttpPost修饰的操作,并用GET调用它时,它会显示一个错误,就好像该对象不存在一样。为了使这项工作,你应该在你的服务器上手工制作一个post请求。。。这是一种黑客行为

在本例中,您可以将控制器操作的内容放在助手方法中,并从两个操作调用该方法


这样,您可以在每个操作中保留其
HTTPPost
ValidateAntiForgeryToken
属性。

您做错了!您不应该像这样创建控制器。控制器不应该这样使用。如果有一段逻辑对这两个操作都执行相同的操作,则将其提取到服务类或命令处理程序中,并从两个控制器中使用该类

这看起来可能需要很多额外的工作,但相信我,这是值得维护的

了解MVC的一条规则-应用程序中一个控制器操作对应一个逻辑操作。如果您试图为每个控制器操作分配多个逻辑操作,那么事情很快就会变得脏兮兮的。最后你会得到意大利面代码

很多时候,动作似乎在做同样的事情,而你试图将它重构成普通的方法。但通常这似乎只是类似的行为。实际上,要么重复动作不应该存在,要么两个动作在做不同的事情,只是看起来相似

回答你的直接问题——不要做你正在做的事情。停止,思考和重构,这样你就不需要做这些黑客

更新:并且您不能导航到来自其他控制器的POST操作是正确的。POST操作用于表单提交。用户从提交表单,并使用防伪令牌转到POST操作。如果要重定向用户,需要执行以下操作:

public class HomeController : Controller
{
    public ActionResult Blah(int someParam)
    {
        // do something

        return RedirectToAction("SomeOtherAction", "SomeOther");
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeOtherAction()
    {
        // and do something here
        return View();
    }
}    
public class SecondController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SomeAction(SomeModel model)
    {
        if (ModelState.IsValid)
        {
            // Add to database, or whatever, and now redirect
            return RedirectToAction("Success");
        }

        // Redisplay the form if validation failed.
        return View(model);
    }
}

你做错了!您不应该像这样创建控制器。控制器不应该这样使用。如果有一段逻辑对这两个操作都执行相同的操作,则将其提取到服务类或命令处理程序中,并从两个控制器中使用该类

这看起来可能需要很多额外的工作,但相信我,这是值得维护的

了解MVC的一条规则-应用程序中一个控制器操作对应一个逻辑操作。如果您试图为每个控制器操作分配多个逻辑操作,那么事情很快就会变得脏兮兮的。最后你会得到意大利面代码

很多时候,动作似乎在做同样的事情,而你试图将它重构成普通的方法。但通常这似乎只是类似的行为。实际上,要么重复动作不应该存在,要么两个动作在做不同的事情,只是看起来相似

回答你的直接问题——不要做你正在做的事情。停止,思考和重构,这样你就不需要做这些黑客

更新:并且您不能导航到来自其他控制器的POST操作是正确的。POST操作用于表单提交。用户从提交表单,并使用防伪令牌转到POST操作。如果要重定向用户,需要执行以下操作:

public class HomeController : Controller
{
    public ActionResult Blah(int someParam)
    {
        // do something

        return RedirectToAction("SomeOtherAction", "SomeOther");
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeOtherAction()
    {
        // and do something here
        return View();
    }
}    
public class SecondController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SomeAction(SomeModel model)
    {
        if (ModelState.IsValid)
        {
            // Add to database, or whatever, and now redirect
            return RedirectToAction("Success");
        }

        // Redisplay the form if validation failed.
        return View(model);
    }
}

我将在这里讨论一个问题,因为您可能不知道您可以
发布到另一个控制器,但它发生在视图中,而不是从动作中

Html.BeginForm()
有几个重载,可以让您完全控制希望表单提交到哪个控制器/操作。假设这是
FirstController/Index
的视图:

@using (Html.BeginForm("SomeAction", "SecondController", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    // rest of form
}
SecondController
可能如下所示:

public class HomeController : Controller
{
    public ActionResult Blah(int someParam)
    {
        // do something

        return RedirectToAction("SomeOtherAction", "SomeOther");
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeOtherAction()
    {
        // and do something here
        return View();
    }
}    
public class SecondController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SomeAction(SomeModel model)
    {
        if (ModelState.IsValid)
        {
            // Add to database, or whatever, and now redirect
            return RedirectToAction("Success");
        }

        // Redisplay the form if validation failed.
        return View(model);
    }
}

我将在这里讨论一个问题,因为您可能不知道您可以
发布到另一个控制器,但它发生在视图中,而不是从动作中

Html.BeginForm()
有几个重载,可以让您完全控制希望表单提交到哪个控制器/操作。假设这是
FirstController/Index
的视图:

@using (Html.BeginForm("SomeAction", "SecondController", FormMethod.Post))
{
    @Html.AntiForgeryToken()
    // rest of form
}
SecondController
可能如下所示:

public class HomeController : Controller
{
    public ActionResult Blah(int someParam)
    {
        // do something

        return RedirectToAction("SomeOtherAction", "SomeOther");
    }
}

public class SomeOtherController : Controller
{
    public ActionResult SomeOtherAction()
    {
        // and do something here
        return View();
    }
}    
public class SecondController : Controller
{
    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult SomeAction(SomeModel model)
    {
        if (ModelState.IsValid)
        {
            // Add to database, or whatever, and now redirect
            return RedirectToAction("Success");
        }

        // Redisplay the form if validation failed.
        return View(model);
    }
}

您必须使用控制器来执行此操作吗?我认为答案是否定的,控制器应该渲染视图、重定向等等,但当通过控制器创建对象的新实例时,我认为类更合适。如果不是这样的话,你在想什么