gpt4 book ai didi

asp.net-mvc - 从类型 'System.String' 到类型 'T' 的参数转换失败,因为没有类型转换器可以在这些类型之间转换

转载 作者:行者123 更新时间:2023-12-02 05:10:11 33 4
gpt4 key购买 nike

注意:这里的所有代码都是作为示例解释的,因为我无法显示真实代码。

我有一个看起来像这样的 View 模型类

public SearchViewModel
{
public string Term
{
get; set;
}

public SearchResult Result
{
get; set;
}

public List<Filter> Filters
{
get; set;
}
}

这绑定(bind)到常规 Controller ,一切正常:

 public ActionResult Search (SearchViewModel model)
{
if (ModelState.IsValid)
{
model.Result = _searchService.Search(model.Term);
return View(model);
}
}

我还有另一个处理从包含复选框的表单接收 POST 的操作。该 Controller 负责创建 Filter 类并重定向到 Search 操作。

类似于:

    public ActionResult Filter(FormCollection formParams)
{
return RedirectToAction("Search", new SearchViewModel
{
Term = formParams["Term"],
Filters =
formParams.Keys
.Cast<String>()
.Where(k => k.Contains("filter"))
.Select(k => Filter.Build(k, formParams[k]))
.ToList()
});
}

这会将填充了 List 集合的 ViewModel 传递回 Search 操作。

但是,在搜索操作中,ModelState.IsValid 现在返回 false。这是因为模型绑定(bind)器抛出这个异常:

The parameter conversion from type 'System.String' to type 'Filter' failed because no type converter can convert between these types.

查看 ModelState 中“Filters”的原始值表明它是一个字符串:

   System.Collections.Generic.List`1[Filter]

似乎 List 的实际内容在操作之间的转换期间丢失了,可能是因为它只对属性成员调用了 ToString()。

在这一点上,我对失败的原因有一个模糊的想法,我想我可以编写一个自定义模型绑定(bind)器或类型转换器来使其工作,但是,我觉得这种方法有味道,这是可能是微不足道的事情,我只是处理错了。

那么,将复杂类型的集合从一个操作传递到另一个操作的正确 ASP.NET MVC 3 是什么?

最佳答案

RedirectToAction 只是一个 HTTP 302 重定向。您确定需要浏览器重新请求新页面吗?

例如,您想避免页面重新加载触发“重新提交发布数据”对话框吗? (参见 POST-REDIRECT-GET 模式)

为什么不直接使用:

public ActionResult Filter(FormCollection formParams) 
{
return Search(new SearchViewModel{
Term = formParams["Term"],
Filters =
formParams.Keys
.Cast<String>()
.Where(k => k.Contains("filter"))
.Select(k => Filter.Build(k, formParams[k]))
.ToList()
});
}

或者,您可以使用 TempData 来存储请求之间的状态,或者在合适的情况下可能使用客户端 cookie。

如果您希望搜索结果页面在用户浏览器中成为书签,您需要使用 REST 或某种形式的序列化字符串(例如 JSON)在 URL 中表示搜索参数的状态

关于asp.net-mvc - 从类型 'System.String' 到类型 'T' 的参数转换失败,因为没有类型转换器可以在这些类型之间转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406094/

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