2015-03-18 2 views
-1

В проекте Mvc Я не могу вызвать метод в представлении, используя экземпляр. Я использовал AutoFac для инъекций зависимостей.Невозможно вызвать метод в представлении с использованием экземпляра?

В HomeController.cs

public readonly IMyClass _myClass; 

public HomeController(IMyClass myClass) 
{ 
    _myClass = myClass; 
} 

В MyClass У меня есть один Перевести метод, который принимает строку в качестве параметра и дает преобразованную строку в качестве вывода, основанного на коде языка.

Я сделал это в контроллере, который работает нормально.

var myModel = new MyModel 
      { 
       Message = _myClass.Translate("Welcome") 

      }; 
return View("Index", myModel); 

Но я не хочу его через Model я хотел бы назвать Translate в View

Я попытался назвать это Translate method из Index.cshtml зрения, как следующее:

_myClass.Translate("Welcome") 

Я думаю, что я пропустил что-то, но что?

+0

Что вы имеете в виду, не можете назвать метод? Как получить доступ к полям вашего контроллера - http://stackoverflow.com/questions/1417168/asp-net-mvc-access-controller-instance-from-view? –

+1

Зачем вам нужно вызывать метод на вашем контроллере с точки зрения !? Вы даже пытаетесь сделать это, это плохая практика. То, что вам нужно сделать, это то, что делает этот метод, вернуть его в представление с помощью модели. –

+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) 
+0

хорошо классный материал :) – Neo

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 ... ш что вам нужно.

Этот подход имеет то преимущество, что ваша реализация перевода красиво отделена от вашего веб-приложения, что может быть сложно сделать с помощью специальных помощников. Помощники, как правило, более подходят для ситуаций, когда вам не нужно полагаться на услуги и можете работать с удовольствием в контексте, предоставленном самим помощником.

+0

Я сделал то же самое, что и в контроллере, но я не хочу его с моделью, которую хочу вызвать это на View 'вар MyModel = новый MyModel { Message = _myClass.Translate ("Добро пожаловать") };' – Neo

+1

нет у вас нет. Нет веских оснований для этого в представлении. Почему вы хотите нарушать такие соглашения? –

Смежные вопросы