我有一个带有自定义数据库路由的应用程序:
routes.Add("RouteWeb", new RouteWeb());
public override RouteData GetRouteData(HttpContextBase httpContext)
{
if (httpContext.Request.IsAjaxRequest() || httpContext.Request.Url == null) return null;
var page = FindPageFromDataBase(httpContext.Request.Url);
if (page == null) return null;
var pageResult = new RouteData(this, new MvcRouteHandler());
pageResult.Values["culture"] = page.Culture;
pageResult.Values["controller"] = page.controller;
pageResult.Values["action"] = page.action;
return pageResult;
}
如您所见,我从数据库中获取页面,因此该站点的管理员可以更改页面的路由(www.site.com/page -> www.site.com/other-name)并且该站点使用新的姓名。
在数据库中,我检索页面的文化,因为每个页面都可能具有不同的文化,例如,如果您访问 www.site.com/page 它会获取英文内容,而如果您访问 www.site.com /pagina 它以西班牙语显示内容。
当用户可以使用日期过滤页面时,除了一个细节之外,这非常有效。
@using (Ajax.BeginForm(null, null, new AjaxOptions { HttpMethod = FormMethod.Get.ToString(), InsertionMode = InsertionMode.Replace, UpdateTargetId = "content_list", Url = Url.Action("UsersItems", "Users"), OnComplete = "OnComplete" }, new { id = "formSearch" }))
{
...
@Html.DatePickerRangeFor(model => model.DateFrom, new { @class = "form-control", Value = Model.DateFrom == null ? "" : Convert.ToDateTime(Model.DateFrom).ToShortDateString()})
}
我必须使用自定义 ModelBinder 根据所选页面的语言将日期更改为正确的格式。
public class NullableDateTimeBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
{
var cultureInfo = new CultureInfo(controllerContext.RouteData.Values["culture"].ToString());
System.Threading.Thread.CurrentThread.CurrentUICulture = cultureInfo;
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(cultureInfo.Name);
var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
return value?.ConvertTo(typeof(DateTime), CultureInfo.CurrentCulture);
}
}
我的问题是
controllerContext.RouteData.Values["culture"]
始终为空。当我第一次加载页面时,RouteData 获取了文化,但是在执行部分 ajax 请求时,所有值都消失了,并且 ModelBinder 给了我一个错误。
我不想将当前文化存储在会话变量中,因为我从数据库页面中读取了语言,并且只有 ajax 请求加载部分视图时才有问题。
有没有办法将当前页面的文化传递给 ModelBinder?
提前致谢。