【问题标题】:Unable to call method in view using instance?无法使用实例调用视图中的方法?
【发布时间】:2015-03-18 09:13:21
【问题描述】:

在 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 打电话给TranslateView

我尝试从Index.cshtml 视图中调用此Translate method,如下所示:

_myClass.Translate("Welcome")

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

【问题讨论】:

  • 不能调用方法是什么意思?您如何访问控制器的字段 - stackoverflow.com/questions/1417168/…
  • 为什么要从视图中调用控制器上的方法!?你甚至试图这样做都是不好的做法。你需要做的就是不管那个方法在做什么,用模型把它返回给视图。
  • 在action方法中调用它,并使用模型或视图包将结果传递给视图。
  • MVC 不像 asp 那样工作,代码隐藏在页面后面,你想做的是一种反模式

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


【解决方案1】:

有很多可以接受的选择......你正在做的不是其中之一。

我个人不会把它全部传给模型..你的模型会变得很臃肿。

一个选项是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)

【讨论】:

    【解决方案2】:

    您正在执行的操作不起作用,因为您不能从视图中任意调用控制器(或其字段)上的方法。你不应该尝试。首先为视图提供所需的一切。

    我通过使用自定义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... 任何你需要的东西。

    这种方法的优势在于您的翻译实现与您的网络应用程序很好地分离,而使用自定义帮助程序可能很难实现。助手往往更适合您不需要依赖服务并且可以在助手本身提供的上下文中愉快地工作的情况。

    【讨论】:

    • 我在控制器中做了同样的事情,但我不想在模型上使用它,我想在 View 上调用它`var myModel = new MyModel { Message = _myClass.Translate("Welcome") }; `
    • 不,你没有。在视图中没有充分的理由这样做。为什么要打破这样的约定?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多