1

我有日期时间和数字的自定义模型活页夹。它们可以很好地将我的请求字符串值转换为有效的强类型值。

现在我需要Url.Action使用 Model Binder 来做相反的事情。我传入一个数据时间或一个数字,我需要它知道如何将其转换为字符串。

ASP.NET 模型绑定是否也应该以其他方式工作?将传递给 Url.Action 的值转换为正确的字符串表示形式?

如果没有,有没有办法做到这一点?

编辑

我问是因为我测试过但它不起作用但我不知道我是否遗漏了什么

4

1 回答 1

1

ASP.NET 模型绑定是否也应该以其他方式工作?将传递给 Url.Action 的值转换为正确的字符串表示形式?

不,模型绑定不能以其他方式工作。这就是路由基础设施的工作。

如果没有,有没有办法做到这一点?

我可以看到的一个想法是创建一个自定义RouteValueDictionary类。

public class CustomRouteValueDictionary: RouteValueDictionary
{
    public CustomRouteValueDictionary(object values)
    {
        foreach (var prop in values.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
        {
            var value = prop.GetValue(values, null);

            if (value.GetType() == typeof(DateTime))
            {
                value = ((DateTime)value).ToString("yyyy/MM/dd");
            }

            Add(prop.Name, value);
        }
    }
}

有内置的 Action 方法UrlHelper将其RouteValueDictionary作为参数,您可以将其传递CustomRouteValueDictionary给它。

前任。

而不是这个

@Url.Action("SomeAction", "SomeController", new { dt = DateTime.Now })

Output: /SomeController/SomeAction?dt=07%2F21%2F2012%2019%3A21%3A59 

您可以使用

@Url.Action("SomeAction", "SomeController", new 
   CustomRouteValueDictionary(new { dt = DateTime.Now }))

Output: /SomeController/SomeAction?dt=2012-07-21 

您甚至可以创建自定义扩展方法,直接接受匿名对象并CustomRouteValueDictionary在其中创建。

于 2012-07-21T14:00:40.513 回答