【问题标题】:RedirectToAction with complex-type parameters [duplicate]具有复杂类型参数的 RedirectToAction [重复]
【发布时间】:2018-08-13 17:52:13
【问题描述】:

我不知道如何通过重定向发送 DTO。

我已经尝试了在this Questionthis documentation 中可以找到的所有内容。

我怎样才能做到这一点?

以下是我的尝试和结果的记录:

public ActionResult Create(ComRuleCompoundKeyDto ruleKey)
{
    var dto = new ComRuleOverrideDto()
    {
        Company = 42
    };

发送空 dto:

    //var routeValues = new RouteValueDictionary
    //{
    //    { "ruleKey", ruleKey },
    //    { "dto", dto },
    //};
    //return RedirectToAction(nameof(MaintainOverride), routeValues);

发送 StupidDto 填充为 null:

    //var routeValues = new RouteValueDictionary(new StupidDto
    //{
    //    ruleKey = ruleKey,
    //    dto = dto
    //});
    //return RedirectToAction(nameof(MaintainOverride), routeValues);

发送填充了默认值的 dto:

    //ControllerContext.RouteData.Values.Add("ruleKey", ruleKey);
    //ControllerContext.RouteData.Values.Add("dto", dto);
    //return RedirectToAction(nameof(MaintainOverride));

发送空 dto:

    //return RedirectToAction(nameof(MaintainOverride), new { ruleKey, dto });

System.InvalidOperationException:未找到视图“创建”或其主视图,或者没有视图引擎支持搜索到的位置:

    //return MaintainOverride(ruleKey, dto);

    return null;
}

public ActionResult MaintainOverride(ComRuleCompoundKeyDto ruleKey, ComRuleOverrideDto dto)
{
    var currencies = _srv.GetAllCurrenciesUsedByDealers().Select(x => x.CurrencyCode);

    var custTypes = _srv.GetAllCustomerTypes();
    var unitIds = _srv.GetUnitIds();
    var vm = new OverridesViewModel(currencies, custTypes, unitIds, ruleKey, dto);

    return View(vm);
}

public class StupidDto
{
    public ComRuleCompoundKeyDto ruleKey;
    public ComRuleOverrideDto dto;
}

【问题讨论】:

  • 使用 TempData 在函数之间传递数据
  • @FawadBinTariq 来自链接的问题,“目前我将 ID 存储在 tempdata 中,但是当您在返回后按 f5 再次刷新页面时,tempdata 消失并且页面崩溃。”如果可能的话,我想避免这种情况。
  • 是否可以在你想要的地方制作dto,而不是通过。
  • @AsifRaza 无法制作必须通过的规则密钥。而且我打算重复使用相同的 MaintainOverride 操作进行编辑和创建,所以至少我仍然需要发送 ID。
  • @Shyju 链接的重复问题的答案有“new StoreVm { Id=storeId, Name=store.Name,Code=store.Code};”。这些是原始类型。当我尝试对复杂类型进行相同操作时,它们被发送为 null。或者答案只是不能那样做,我必须将我的 DTO 中包含的所有类型扩展到它们的原语?

标签: c# asp.net-mvc redirect parameters parameter-passing


【解决方案1】:

当返回另一个操作(而不是重定向)时,我设法通过显式设置视图的名称 (nameof(MaintainOverride)) 使其工作。

public ActionResult Create(ComRuleCompoundKeyDto ruleKey)
{
    var dto = new ComRuleOverrideDto()
    {
        Company = 42
    };

    return MaintainOverride(ruleKey, dto);
}

public ActionResult MaintainOverride(ComRuleCompoundKeyDto ruleKey, ComRuleOverrideDto dto)
{
    var currencies = _srv.GetAllCurrenciesUsedByDealers().Select(x => x.CurrencyCode);

    var custTypes = _srv.GetAllCustomerTypes();
    var unitIds = _srv.GetUnitIds();
    var vm = new OverridesViewModel(currencies, custTypes, unitIds, ruleKey, dto);

    return View(nameof(MaintainOverride), vm);
}

【讨论】:

  • 我仍然想知道为什么 RedirectToAction 不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多