it-roy-ru.com

ASP.Net MVC: вызов метода из представления

В моем приложении MVC контроллер получает данные (модель) из внешнего API (так что класс модели не используется) и передает их в представление. Данные (модель) имеют контейнер, в котором есть несколько объектов с несколькими полями (строковые значения). Одно представление перебирает каждый объект и вызывает другое представление, чтобы нарисовать каждый из них. Это представление перебирает поля (строковые значения) и рисует их.

Вот где это становится сложным для меня. Иногда я хочу сделать специальное форматирование полей (строковые значения). Я мог бы написать 20 строк кода для форматирования, но тогда я должен был бы сделать это для каждого поля, и это было бы просто глупо и ужасно. Вместо этого я хотел бы взять поле (строковое значение), передать его методу и получить другое строковое значение обратно. И затем сделайте это для каждого поля.

Итак, вот мой вопрос:

Как я могу вызвать метод из представления?

Я понимаю, что могу задавать не тот вопрос здесь. Ответ, вероятно, заключается в том, что я этого не делаю, и что я должен использовать локальную модель и десериализовать объект, полученный из внешнего API, в свою локальную модель, а затем, в моей локальной модели, выполнить «специальное форматирование», прежде чем передать это к мнению. Но я надеюсь, что есть способ, которым я могу вызвать метод из представления вместо этого. Главным образом из-за того, что преобразование пользовательского объекта, получаемого из API, который, в свою очередь, содержит много других пользовательских объектов, в локальные пользовательские объекты, которые я создаю, требует больших затрат. А также, я не уверен, что лучший способ сделать это будет.

Отказ от ответственности: мне известно о похожем потоке «ASP.NET MVC: вызов метода контроллера из представления» ( ASP.NET MVC: вызов метода контроллера из представления ), но я не вижу, как это отвечает на мои вопрос.

49
doosh

Вот как вы вызываете метод экземпляра на контроллере:

@{
  ((HomeController)this.ViewContext.Controller).Method1();
}

Вот как вы вызываете статический метод в любом классе 

@{
    SomeClass.Method();
}

Это будет работать при условии, что метод является публичным и видимым для представления.

81
lahsrah

Основываясь на ответе Амина, создайте помощника, например:

public static class HtmlHelperExtensions
{
    public static MvcHtmlString CurrencyFormat(this HtmlHelper helper, string value)
    {
        var result = string.Format("{0:C2}", value);
        return new MvcHtmlString(result);
    }
}

на ваш взгляд: используйте @Html.CurrencyFormat(model.value)

Если вы выполняете простое форматирование, например Стандартные числовые форматы , тогда просто используйте string.Format () на ваш взгляд, как в примере с помощником выше:

@string.Format("{0:C2}", model.value)
17
viperguynaz

Вы можете реализовать метод статического форматирования или помощник HTML, а затем использовать этот синтаксис:

@using class_of_method_namespace
...
// HTML page here
@className.MethodName()

или в случае с HTML Helper

@Html.MehtodName()
4
Amine Chafai

Контроллер не должен вызываться из поля зрения. Вот и вся идея MVC - четкое разделение интересов.

Если вам нужно вызвать контроллер из View - вы делаете что-то не так. Время рефакторинга.

3
Illidan

почему вы не используете Ajax для 

это просто и не требует page refresh и имеет обратные вызовы success and error

взгляни на мою самлпе

<a id="ResendVerificationCode" >@Resource_en.ResendVerificationCode</a>

и в JQuery

 $("#ResendVerificationCode").on("click", function() {
                getUserbyPhoneIfNotRegisterd($("#phone").val());
 });

и это мой AJAX, который вызывает мой контроллер и мой контроллер и возвращает объект из базы данных

function getUserbyPhoneIfNotRegisterd(userphone) {

              $.ajax({
                    type: "GET",
                    dataType: "Json",
                    url: '@Url.Action("GetUserByPhone", "User")' + '?phone=' + userphone,
                    async: false,
                    success: function(data) {
                        if (data == null || data.data == null) {
                            ErrorMessage("", "@Resource_en.YourPhoneDoesNotExistInOurDatabase");
                        } else {
                            user = data[Object.keys(data)[0]];
                                AddVereCode(user.ID);// anather Ajax call 
                                SuccessMessage("Done", "@Resource_en.VerificationCodeSentSuccessfully", "Done");
                        }
                    },
                    error: function() {
                        ErrorMessage("", '@Resource_en.ErrorOccourd');
                    }
                });
            }
2
Basheer AL-MOMANI

Вы должны создать собственный помощник для простого изменения формата строки, за исключением использования вызова контроллера.

1
tkestowicz

Я попробовал ответ lashrah, и он сработал после небольшого изменения синтаксиса .. Вот что сработало для меня:

@(
  ((HomeController)this.ViewContext.Controller).Method1();
)
0
bthn