gpt4 book ai didi

asp.net-mvc - 如何将 POST 请求重定向到在 MVC 中维护模型值的 url

转载 作者:行者123 更新时间:2023-12-03 18:31:38 25 4
gpt4 key购买 nike

我有一个相当标准的排序/过滤/页面搜索表单,但需要控制 url 的格式。 sort/filter/page 参数都应该是 url 的一部分,例如,地址可以通过电子邮件发送给某人。

当添加另一个过滤器参数时,会发出一个 POST 请求。我的 Controller 方法如下所示:

[HttpPost]
public ActionResult Search(string filterField,
Operator filterOperator,
string filterValue,
PeopleGroupSearchModel model);
PeopleGroupSearchModel由查询字符串参数填充。 filter*参数来自发布的表单值。

我想解析提供的过滤器值,然后将过滤器添加到模型中名为 Filters 的集合中.然后,获取更新后的模型并将其转换为适当的 url,并将其作为响应传递给用户。

因此,例如,如果他们在此页面上:
PeopleGroup/Search?page=4&sort=Country

...和发布:
  • filterField = PeopleGroupName
  • filterOperator = 等于
  • filterValue = 祖鲁语

  • ...一旦所有处理完成,他们浏览器中的地址应该是这样的:
    PeopleGroup/Search?page=4&sort=Country&PeopleGroupName=Zulu&PeopleGroupName_op=Equals

    所以,或多或少我想做的是:
    [HttpGet]
    public ActionResult Search(PeopleGroupSearchModel model)
    {
    PeopleGroupData.Search(model);
    ViewData.Model = model;
    return View();
    }

    [HttpPost]
    public ActionResult Search(string filterField,
    Operator filterOperator,
    string filterValue,
    PeopleGroupSearchModel model)
    {
    PeopleGroupFilter filter = ParseFilter(filterField,
    filterOperator,
    filterValue);
    model.Filters.Add(filter);
    return RedirectToAction("Search", ???);
    }

    我对 MVC 很陌生,所以如果我完全错误地处理这个问题,请告诉我!

    最佳答案

    有几种可能实现 Redirect-After-Post ASP.NET MVC 中的模式(这是您在这里所追求的,恕我直言,这是一个非常好的模式):

  • 使用TempData .在 POST 操作中,将模型存储在 TempData 中并重定向:
    TempData["model"] = model;
    return RedirectToAction("Search");

    然后在 Search 操作中检查 TempData 是否存在以获取模型:
    PeopleGroupSearchModel model = TempData["model"] as PeopleGroupSearchModel;

    这种方法的缺点是 TempData仅针对单个重定向持续存在,这意味着如果用户在执行 Search GET 操作时按 F5,您将被搞砸。这可以通过使用 Session 来缓解。但是当然 Session 引入了另一个可伸缩性问题。所以我不喜欢这种方法。
  • 传递请求的所有属性:
    return RedirectToAction("Search", new {
    prop1 = model.Prop1,
    prop2 = model.Prop2,
    ....
    });

    现在,当重定向到 Search GET 操作时,默认模型绑定(bind)器将能够重建模型。这种方法的一个明显缺点是,如果您的模型具有许多属性,甚至复杂类型的属性更差,这可能很快成为一个繁琐的解决方案。您可能可以使用一些文本格式(例如 JSON)作为查询字符串参数来序列化模型。当然,查询字符串参数在不同的浏览器之间是有限的,所以这也可能是一个禁忌。
  • 将模型保存在一些数据存储中并检索一个唯一的 id,以便以后可以从该存储中检索它:
    int id = Persist(model);
    return RedirectToAction("Search", new { id = id });

    然后在 GET 操作中使用 id 从这个相同的持久性存储中检索模型。我喜欢这种方法并且大部分时间都在使用它。如果持久化到上述数据存储很昂贵,您可以使用缓存。
  • 关于asp.net-mvc - 如何将 POST 请求重定向到在 MVC 中维护模型值的 url,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821597/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com