【问题标题】:RedirectToAction is Passing a Null ObjectRedirectToAction 正在传递一个空对象
【发布时间】:2018-11-15 20:56:24
【问题描述】:

我正在将代码 sn-p 粘贴到 c# 控件的下方。我无法弄清楚的是,我正在添加到 AddPerson 的 formViewModel 已正确填充,但是当我调用 RedirectToAction 到下面的“SaveForm”方法并传递 formViewModel 时,它在“ SaveForm”方法。

对我不理解的内容有什么建议吗?

谢谢,

            [HttpPost]
        public IActionResult AddPerson(GikFormViewModel formViewModel)
        {
            if(formViewModel.Items == null)
            {
                //formViewModel.Items.Add(new GikItemViewModel() { })
                formViewModel.Items = new List<GikItemViewModel>();
            }
            if (!ModelState.IsValid)
            {
                return View("Index", formViewModel);
            }

        // REDIRECTING HERE TO "SaveForm" Formatting is not properly done

            return RedirectToAction("SaveForm", formViewModel);
            //return View("Index", formViewModel);
        }

        public IActionResult SaveForm(GikFormViewModel formViewModel)
        {
            var person = formViewModel.Person;
            var items = formViewModel.Items;
            var gikItems = new Collection<Gikitem>();
            //var gikPerson = new Gikperson();
            //var gikItem = new Gikitem();
            var gikPerson = new Gikperson()
            {
                Organization = person.Organization,
                Title = person.Title,
                Name = person.FirstName + " " + person.LastName,

                AddressLineOne = person.AddressLineOne,
                AddressLineTwo = person.AddressLineTwo == null ? null : person.AddressLineTwo,
                City = person.City,
                State = person.State,
                Zipcode = person.Zipcode,
                Phone = person.Phone,
                DoNoContact = person.DoNotContact == true ? 1 : 2,
                Email = person.Email
            };

【问题讨论】:

  • 您不能使用RedirectToAction 传递包含复杂属性或集合的模型(查看您正在生成的 url 以了解 - 该方法不会执行递归以生成复杂属性的查询字符串值)

标签: c# asp.net-mvc


【解决方案1】:

尝试使用TempData

ASP.NET MVC 中的TempData 可用于存储临时数据,可用于后续请求。 TempData 将在后续请求完成后被清除。

AddPerson 操作

[HttpPost]
public IActionResult AddPerson(GikFormViewModel formViewModel)
{
    if(formViewModel.Items == null)
    {
        //formViewModel.Items.Add(new GikItemViewModel() { })
        formViewModel.Items = new List<GikItemViewModel>();
    }
    if (!ModelState.IsValid)
    {
        return View("Index", formViewModel);
    }

    //Save the model into the TempData object.
    TempData["model] = formViewModel;

    return RedirectToAction("SaveForm");
    //return View("Index", formViewModel);
}

SaveForm 操作

public IActionResult SaveForm()
{
    //If TempData doesn't contains your model then return error message or something.
    if(!TempData.ContainsKey("model"))
        return new HttpNotFoundResult();

    //Retrieve the model from TempData object.
    var formViewModel = TempData["model"] as GikFormViewModel;

    var person = formViewModel.Person;
    var items = formViewModel.Items;
    var gikItems = new Collection<Gikitem>();
    ...
}

【讨论】:

  • 嘿,谢谢。这太奇怪了,我已经做了一年了,还没有遇到这个问题。我试过了,模型正在保存到 TempData,所以它确实有效,但有一个问题。奇怪的是,我在RedirectToAction("SaveForm") 上收到了 500 服务器错误。我没有传递 formViewModel,也不再将其作为参数。代码看起来和你的一样。但是,如果我注释掉 TempData["model"] = formViewModel;,那么我将不再收到 500 错误。
  • 上面的链接可能会有所帮助。我会尝试这些步骤。但是他们说要设置环境“开发”变量,那么生产呢?否则,我可能会在发送到保存表单之前创建并保存到模型。
  • 我正在使用 .Net Core,这可能也是分享的好东西。
  • 虽然我不完全确定为什么当您将复杂对象添加到 TempData 然后 RedirectToAction 时会出错。我知道您是否先序列化对象然后反序列化它工作正常:TempData [ “模型”] = JsonConvert.SerializeObject(formViewModel); var formView = JsonConvert.DeserializeObject(TempData["model"].ToString());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多