【问题标题】:Model value redirected to another action does not pass all values重定向到另一个操作的模型值不会传递所有值
【发布时间】:2019-08-06 12:02:07
【问题描述】:

我有一个 ASP.Net Core 应用程序,它需要将模型从一个动作传递到另一个动作。

这些是模型:

public class ClassA
{
    public string Id{get;set;}
    public string Name {get;set;}
    public StudentMarks Marks {get;set;}
}

public class StudentMarks
{
    public int Marks {get;set;}
    public string Grade {get;set;}
}

还有后控制器:

[HttpPost]
public ActionResult TestAction1(ClassA model)
{   
    return RedirectToAction("TestAction2", model);
}

public ActionResult TestAction2(ClassA model)
{


}

在TestAction 1 中调试时,我看到Id、Name 和marks 具有价值。

我在 TestAction2 中获得的 Id 值与在 TestAction1 中的值相同。而复杂对象 Marks 的值在 TestAction2 动作方法中没有得到。

我还有哪些其他选择?

【问题讨论】:

  • 也许可以试试RedirectToAction("TestAction2", new { model = model });
  • 这里可能有一些指针:stackoverflow.com/questions/22505674/…
  • @Izzy 我也试过了,结果一样。
  • 简单的return TestAction2(model) 而不是RedirectToAction 怎么样。您也可以使用TempData
  • 小问题,但您的 A 类课程不应该将 StudentMarks 作为“StudentMarks”类型。如果不是,那么标记是什么?

标签: c# asp.net-core


【解决方案1】:

您不能使用模型进行重定向。重定向只是一个带有 301、302 或 307 状态代码和 Location 响应标头的空响应。 Location 标头包含您希望将客户端重定向到的 URL。

客户端然后必须向标头中的那个 URL 发出一个新请求,如果它选择这样做。浏览器会自动执行此操作,但并非所有 HTTP 客户端都会这样做。重要的是,这个新请求是通过 GET 发出的,而 GET 请求没有正文。 (从技术上讲,HTTP 规范允许这样做,但实际上没有浏览器或 HTTP 客户端支持。)

目前尚不清楚您的最终目标是什么,但如果您需要在请求之间临时保存数据(例如重定向),那么您应该将该数据序列化为 TempData 键。

【讨论】:

    【解决方案2】:

    您可以使用TempData 将模型数据传递给Asp.Net Core 中的重定向请求在Asp.Net 核心中,您不能在TempData 中传递复杂类型。您可以传递简单类型,如字符串、int、Guid 等。如果您想通过TempData 传递复杂类型对象,您可以将对象序列化为字符串并传递它。我制作了一个简单的测试应用程序,足以满足您的需求:

    控制器:

    public ActionResult TestAction1(ClassA model)
    {
        model.Id = "1";
        model.Name = "test";
        model.Marks.Grade = "A";
        model.Marks.Marks = 100;
        var complexObj = JsonConvert.SerializeObject(model);
        TempData["newuser"] = complexObj;
        return RedirectToAction("TestAction2");
    }
    
    public ActionResult TestAction2()
    {
        if (TempData["newuser"] is string complexObj )
        {
            var getModel= JsonConvert.DeserializeObject<ClassA>(complexObj);
        }
        return View();
    }
    

    型号:

    public class ClassA
    {
        public ClassA()
        {
            Marks = new StudentMarks();
        }
    
        public string Id { get; set; }
        public string Name { get; set; }
        public StudentMarks Marks { get; set; }
    }
    
    public class StudentMarks
    {
        public int Marks { get; set; }
        public string Grade { get; set; }
    }
    

    如果您想为更多请求保留TempData 值,您可以使用PeekKeep 函数。这个answer 可以更深入地了解这些功能。

    【讨论】:

      【解决方案3】:

      我认为您将模型和 routeValues 混淆了。您正在调用的 RedirectToAction 的重载(接受一个字符串和一个对象)需要一个 routeValues 参数,而不是模型参数。 https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.controllerbase.redirecttoaction?view=aspnetcore-2.2

      TestAction1 是通过 Post 调用的,而 TestAction2 是通过 Get 调用的。您需要制定一个 URL,使您能够以您想要的方式调用 TestAction2(独立于 TestAction1 中的 RedirectToAction)。我猜这将涉及设置自定义路线。一旦你有了一个可以让你以你想要的方式调用 TestAction2 的 URL,你就可以在 TestAction1 的 RedirectToAction 中指定路由值来形成该 URL。

      【讨论】:

        【解决方案4】:

        我认为问题在于你应该使用:

        return RedirectToAction("TestAction2", model);
        

        (您在没有return 的情况下执行此操作)

        【讨论】:

        • 如果只写RedirectToAction而不返回,编译器会不会显示错误?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-03
        相关资源
        最近更新 更多