gpt4 book ai didi

c# - 模型绑定(bind)时如何让asp.net mvc将字符串数组转换为值类型数组?

转载 作者:行者123 更新时间:2023-11-30 22:12:10 26 4
gpt4 key购买 nike

我们的系统有一组已知的“契约(Contract)类型”,它们有代码和名称。

public struct ContractType {
public string Code { get; set; }
public string Name { get; set; }
}

我有一个带有类似方法的 MVC Controller 。

[HttpGet]
public ActionResult Search(SearchOptions options) {
// returns search results
}

SearchOptions 包含很多参数(包括ContractType的数组)

public class SearchOptions {
public ContractTypes[] Contracts { get; set; }
// other properties
}

我希望 asp.net MVC 自动将契约(Contract)类型代码转换为 SearchOptions 模型上的契约(Contract)类型数组。例如,我希望 MVC 模型绑定(bind)器采用这样的查询字符串...

http://abc.com/search?contracts=ABC&contracts=XYZ&foo=bar

并填充SearchOptions,使其看起来像下面的数据结构

{
Contracts : [
{ Code : "ABC", Name: "ABC Contract Name" },
{ Code : "XYZ", Name: "XYZ Contract Name" }
],
// other properties
}

我有一个方法可以接受契约(Contract)类型代码并返回适当的契约(Contract)类型。

public ContractType GetContractTypeByCode(string code) {
// code which returns a ContractType
}

我不清楚我是否需​​要使用自定义模型绑定(bind)器或值提供程序。感谢您的帮助。

最佳答案

我认为你应该使用 ModelBinder。像这样

public class SearchOptionsDataBinder : DefaultModelBinder
{
public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
if (bindingContext.ModelType == typeof(SearchOptions))
{
var baseResult = (SearchOptions)base.BindModel(controllerContext, bindingContext);
var request = controllerContext.HttpContext.Request;

baseResult.Contracts = request.QueryString
.GetValues("contracts")
.Select(GetContractTypeByCode)
.Where(c => !string.IsNullOrEmpty(c.Code))
.ToArray();
return baseResult;
}

return base.BindModel(controllerContext, bindingContext);
}
}

然后将自定义模型绑定(bind)器添加到Application_Start:

ModelBinders.Binders.Add(typeof(SearchOptions), new SearchOptionsDataBinder());

关于c# - 模型绑定(bind)时如何让asp.net mvc将字符串数组转换为值类型数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19866417/

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