gpt4 book ai didi

asp.net-mvc - ASP.NET MVC RouteValueDictionary 和复杂对象

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

跨搜索结果页面保留表单帖子( View 模型)结果的最佳方法是什么?

我有一个包含复选框的搜索表单。此表单是使用 View 模型构建的,例如

public class SearchViewModel
{
public string Name { get; set; }
public string[] Colors { get; set; }
}

当这个 View 模型被发回时,我使用这些值来构建一个查询(使用 EF)。结果被转换成一个 PagedList。
    public class SearchController : Controller
{
public ActionResult Index()
{
//this displays the search form.
return View();
}

public ActionResult Results(string game, SearchViewModel vm)
{
//this displays the results
ViewBag.SearchViewModel = vm;
var matches = _repository.AsQueryable()
.ColorOr(vm.Colors)
.WhereIf(vm.Name.IsNotEmpty(), x => x.Name.Contains(vm.Name.Trim()));

return View(matches.ToPagedList(1, 10));
}
}

现在显示了结果,我想使用 Html.PagedListPager 和 RouteValueDictionary 来创建分页。
@Html.PagedListPager((IPagedList)Model, page => Url.Action("Results", new RouteValueDictionary(ViewBag.SearchViewModel)))

然而;创建的 URL 如下所示:
http://localhost:5139/search?Name=test&Colors=System.String[]&PageIndex=0

颜色的值最终成为类型而不是值。我希望 URL 看起来更像:
 http://localhost:5139/search?Name=test&Colors=[Blue,Pink,Yellow]&PageIndex=0
  • 跨搜索结果页面保留表单帖子( View 模型)结果的最佳方法是什么?
  • RouteValueDictionary 可以支持复杂对象吗?
  • 我应该使用类似 unbinder 的东西吗?
  • 使用 ViewData 或 Session 会更好吗?
  • 最佳答案

    我为这样的案例所做的事情,我发现简单但功能强大,是将我的 View 模型对象序列化为 JSON(在您的情况下是 SearchViewModel ),使用类似 NewtonSoft JSON.net 的东西然后使用生成的 JSON 字符串,通过 zlib.net 对该字符串进行简单的压缩Zlib.DeflateStream类(您也可以使用 AES Rijndael 之类的东西,但无疑会更慢,而且您首先需要速度),然后将生成的 Base64 字符串传递到您的 QueryString。

    然后,当您准备再次使用它时(它实际上是一个 View 状态),只需解压缩 JSON 字符串并将其从 JSON 反序列化为相应的 .NET 对象(再次在您的情况下 SearchViewModel )。

    对我来说是一种享受,并且您最终不会得到一个无法管理的 URL 或任何真正可衡量的性能影响,我见过的只有少数表单字段被序列化。

    我将很快详细说明一个代码示例。

    更新:代码示例...

    这就是我在您的特定情况下会做的事情:

    Results(string, SearchViewModel)行动:

    public ActionResult Results(string encryptedUrlViewModel, string game, SearchViewModel vm)
    {
    SearchViewModel searchUrlViewModel = null;
    if (!string.IsNullOrEmpty(searchUrl)) {
    // only first submission, no url view model set yet, so compress it and store..
    encryptedUrlViewModel = Convert.ToBase64String(
    DeflateStream.CompressString(JsonConvert.SerializeObject(vm)));
    ViewBag.EncryptedUrlViewModel = encryptedUrlViewModel;
    }
    else {
    var jsonUrlViewModel = DeflateStream.UncompressString(Convert.FromBase64String(encryptedUrlViewModel));
    searchUrlViewModel = JsonConvert.DeserializeObject(jsonUrlViewModel, typeof(SearchViewModel)) as SearchViewModel;
    // at this point you should have a serialized 'SearchViewModel' object
    // ready to use which you can then tweak your query below with.
    }
    var matches = _repository.AsQueryable()
    .ColorOr(vm.Colors)
    .WhereIf(vm.Name.IsNotEmpty(), x => x.Name.Contains(vm.Name.Trim()));

    return View(matches.ToPagedList(1, 10));
    }

    鉴于:
    @Html.PagedListPager((IPagedList)Model, page => Url.Action("Results", new { encryptedUrlViewModel = ViewBag.EncryptedUrlViewModel }))

    代码可能需要一些调整,在你的场景中未经测试,但它会是这样的,祝你好运:)

    不过,您真的应该考虑一下,如果您想通过分页在 URL 中携带用户的请求,那么人们会考虑为什么表单不是作为 GET 制作的。请求而不是 POST首先提出要求。您特别想要它的任何理由 POST ?我想 GET将携带您的 Colors数组正确,但请确保您的 View 模型设置正确。 See this Haacked article for model binding to lists .

    关于asp.net-mvc - ASP.NET MVC RouteValueDictionary 和复杂对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8579666/

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