又一个MVC本地化问题......
我正在尝试使用本地化的资源文件本地化ASP.Net MVC 3应用程序,以按照建议在视图中显示文本.
像往常一样,问题是尝试从数据注释本地化默认错误消息时.
我知道你可以在每个属性中指定资源文件和密钥:
[Required(
ErrorMessageResourceType = typeof(CustomResourceManager),
ErrorMessageResourceName = "ResourceKey")]
public string Username { get; set; }
Run Code Online (Sandbox Code Playgroud)
甚至,这是更好和首选,您可以覆盖默认消息,如下所示:ASP.NET MVC中的数据注释的默认资源,因此您可以保留属性,如:
[Required]
public string Username { get; set; }
Run Code Online (Sandbox Code Playgroud)
最后一种方法是我正在遵循的方法,并且它可以工作,但只有当您要覆盖的DataAnnotation具有ONE和ONLY ONE错误消息时,因为它总是查找与自定义资源文件中的属性相同的资源键(例如"Required"需要资源文件中的"RequiredAttribute"条目)
其他属性(如StringLength)具有多个错误消息,具体取决于您使用的可选参数.所以,如果你有一个像这样的模型:
public class Person
{
[Required]
[StringLengthLocalizedAttribute(10, MinimumLength = 5)]
[Display(Name = "User name")]
public string UserName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误消息是" 字段用户名必须是最小长度为5且最大长度为10的字符串. "
如果您将StringLength属性更改为:
[StringLengthLocalizedAttribute(10)]
Run Code Online (Sandbox Code Playgroud)
错误消息更改为" 字段用户名必须是最大长度为10的字符串. "因此,在这种情况下,至少有2个默认错误消息要覆盖,@ kim-tranjan给出的解决方案失败.
我对此的部分解决方案是实现我自己的StringLength属性,如下所示:
public class StringLengthLocalizedAttribute : …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用自定义T4模板将新控制器添加到MVC 3项目中.我有自己的模板,Scott Hanselman在http://www.hanselman.com/blog/ModifyingTheDefaultCodeGenerationscaffoldingTemplatesInASPNETMVC.aspx上写道,但我有兴趣在MvcTextTemplateHost类中挖掘更多,看看它提供了什么,所以我们可以自定义我们的控制器,看看它如何与"添加控制器..."对话框进行交互.
但是我找不到(在搜索谷歌之后,当然......)对这个类的引用,也没有MSDN或者任何其他MS站点...任何想法?
谢谢,塞尔吉
我们正在使用ASP.Net 4和MVC 3 Framework开发Web应用程序.我已经通过NuGet安装了T4MVC,所有的视图,控制器和静态内容都成功地生成为强类型.
但是,当我尝试编译项目时,它会在生成的文件T4MVC.cs中引发错误,这是:
'T4MVC_ViewResultBase.FindView(System.Web.Mvc.ControllerContext)':
return type must be 'System.Web.Mvc.ViewEngineResult' to match overridden member
'System.Web.Mvc.ViewResultBase.FindView(System.Web.Mvc.ControllerContext)'
Run Code Online (Sandbox Code Playgroud)
这是生成的源代码:
[GeneratedCode("T4MVC", "2.0"), DebuggerNonUserCode]
public class T4MVC_ViewResultBase : System.Web.Mvc.ViewResultBase,
IT4MVCActionResult
{
public T4MVC_ViewResultBase(string area, string controller, string action):
base() {
this.InitMVCT4Result(area, controller, action);
}
protected override void FindView(System.Web.Mvc.ControllerContext context){}
public string Controller { get; set; }
public string Action { get; set; }
public RouteValueDictionary RouteValueDictionary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
错误说:
protected override void FindView(System.Web.Mvc.ControllerContext context) { }
Run Code Online (Sandbox Code Playgroud)
应该:
protected override ViewEngineResult
FindView(System.Web.Mvc.ControllerContext …Run Code Online (Sandbox Code Playgroud)