如何将模型参数值从动作传递到视图并返回到另一个控制器动作?

问题描述 投票:0回答:1

如何让模型在多个操作和视图中保持活动状态?这样中间就不会丢失参数值。我怀疑我在模型绑定中犯了一些基本错误。

例如,

  1. 我有一个模特
public class Car : IDisposable
    {
// Some code
        public string Brand { get; set; }
        public string Color { get; set; }
        public int Capacity { get; set; }
}
  1. 在 Action 中创建此类的实例
[HttpPost]
        public IActionResult Test_car_1st(int x)
        {
            var mycar = new Car();
            mycar.Brand = "Honda";
            // Some Code
            return View("TestView",mycar);
        }
  1. 在“TestView”中,用户可以选择相同Model的颜色。
@model Car;
//Some Code

<form method="post" enctype="multipart/form-data" asp-controller="Home" asp-action="Test_car_2nd" asp-route-Model="@Model" >
//User chooses the color from a dropdown
<select asp-for="@Model.Color">
   <option value="">
   // Some code

</select>
<input type="submit" value="Submit" class="btn btn-primary" asp-controller="Home" asp-action="Test_car_2nd"/>
</form>
  1. 在第二个操作方法中,我尝试访问相同的模型(现在设置了两个参数)。 一个在第一个操作中设置,另一个在 TestView 中设置。
public IActionResult Test_car_2nd(Car Model)
        {
            // Some code
            return View("TestView_2",Model);
        }

我希望在 Test_car_2nd Action 中,两个参数都已设置。但我发现只设置了颜色。另一个参数(品牌)为空。

我想要在一个操作中创建一个模型,并且我会通过各种操作和视图传递该模型来编辑参数值。

我现在拥有的是这个:

  1. 当我修改操作中的参数并调用视图时,模型值将被保留。

  2. 当我在视图中编辑值并调用操作时,仅保留那些在视图中更改/创建值的参数。之前设置的其他参数不会保留(显示为空)。

c# asp.net-core-mvc model-binding
1个回答
0
投票

我想要一个一次性创建的模型,并且我会传递这个模型 通过各种操作和视图来编辑参数值。

为了满足您的场景和描述,您可以使用asp.net core会话来绑定您的Car类。

因为 tempdata 和隐藏的 html 项目无法保留您之前的状态,因为它只能在一个请求周期内保留该值。

在您的场景中,您可能需要操作上一个操作的数据,然后想要传递到下一个操作,甚至您可能想要提取当前操作中的上一个对象。因此,根据您的需求,使用 ASP.NET Core 会话将是一个不错的选择。

让我们看看如何在实践中做到这一点。

演示模型:

public class Car 
{
   
    public string Brand { get; set; }
    public string Color { get; set; }
    public int Capacity { get; set; }
}

在会话中绑定模型:

public static class SessionExtension
{
    //setting session
    public static void SetComplexObjectSession(this ISession session, string key, object value)
    {
        session.SetString(key, JsonConvert.SerializeObject(value));
    }

    //getting session
    public static T? GetComplexObjectSession<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
    }
}

注意:我们将使用此会话静态类将我们的模型绑定到会话中并从会话中检索。

控制器动作中的Modidy值:

[HttpPost]
public IActionResult Test_car_1st(Car Model)
{
   
    var mycar = new Car();
    mycar.Brand = "Honda";
    mycar.Capacity = 10;
    mycar.Color = "Metalic Grey";
    HttpContext.Session.SetComplexObjectSession("CarObject", mycar);
    return RedirectToAction("Test_car_2nd");
}

注意: 不管怎样,我们从视图发布,然后使用

SetComplexObjectSession
修改提交的值并绑定到会话中,这样稍后我们就可以在任何地方获取更新的值。

在另一个操作中获取更新值:

public IActionResult Test_car_2nd()
 {
     var carObject = HttpContext.Session.GetComplexObjectSession<Car>("CarObject");
     return View(carObject);
 }

输出:

注意:如果您还想了解更多关于会话管理的内容,可以参考这个官方文档

© www.soinside.com 2019 - 2024. All rights reserved.