无法使用实例调用视图中的方法?

时间:2015-03-18 09:13:21

标签: c# asp.net-mvc model-view-controller

在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")

我想我错过了什么但是什么?

2 个答案:

答案 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应用程序很好地分离,使用自定义帮助程序实现这一点非常棘手。助手往往更适合您不需要依赖服务的情况,并且可以在助手本身提供的上下文中愉快地工作。