在Mvc项目中,我无法使用实例在视图中调用方法。 我使用AutoFac进行依赖注入。
在HomeController.cs
中public readonly IMyClass _myClass;
public HomeController(IMyClass myClass)
{
_myClass = myClass;
}
在MyClass中,我有一个Translate方法,它将字符串作为参数,并根据语言代码将转换后的字符串作为输出。
我在控制器中做得很好。
var myModel = new MyModel
{
Message = _myClass.Translate("Welcome")
};
return View("Index", myModel);
但我不希望通过Model
我想在Translate
View
我尝试从Translate method
视图中调用此Index.cshtml
,如下所示:
_myClass.Translate("Welcome")
我想我错过了什么但是什么?
答案 0 :(得分:3)
有许多可接受的选择..你正在做的不是其中之一。
我个人不会把它全部传递给模型......你的模型会变得非常臃肿。
一个选项是HtmlHelper
的扩展方法:
public static class TranslationExtensions {
public static IMvcHtmlString Translate(this HtmlHelper helper, string input) { // or just "string" if you're not accepting markup
return MvcHtmlString.Create(<logic to translate input here>);
}
}
然后在你看来..在顶部:
@using Your.Namespace.Where.The.Extensions.Class.Is
......然后:
@Html.Translate("Welcome")
此模式也可用于扩展现有帮助程序,是您应该调查的内容。例如,要创建带有翻译文本的标签,您可以创建允许此项的内容:
@Html.TranslatedLabelFor(x => x.ModelProperty)
答案 1 :(得分:1)
您正在做的事情不起作用,因为您无法在视图中任意调用控制器或其字段上的方法。你不应该尝试。首先让它看到它所需要的一切。
我通过标记需要使用自定义TranslatableAttribute
转换的视图模型属性来实现此目的:
public class MyModel
{
[Translatable]
public string MyProperty { get; set; }
}
然后在控制器(或基本控制器)中,定义一个TranslatedView
方法,该方法使用反射来识别和转换相应的属性值:
public ActionResult TranslatedView(string viewName, object model)
{
foreach (var property in type.GetProperties())
{
/* Using the Castle.Core HasAttribute method - go with whatever
* you like. */
if (property.HasAttribute<TranslatableAttribute>())
{
var value = property.GetValue(model) as string;
if (value != null)
{
property.SetValue(model, _myClass.Translate(value));
}
}
}
return View(viewName, model);
}
显然,这可以根据需要进行复杂化 - 超载它,将其包装成自定义ActionResult
......无论你需要什么。
这种方法的优势在于您的翻译实现与您的Web应用程序很好地分离,使用自定义帮助程序实现这一点非常棘手。助手往往更适合您不需要依赖服务的情况,并且可以在助手本身提供的上下文中愉快地工作。