Подтвердить что ты не робот

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

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

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

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

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

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

Отказ от ответственности: я знаю об аналогичном потоке "ASP.NET MVC: вызов метода контроллера из представления" (ASP.NET MVC: вызов метода контроллера из представления), но я не вижу, как это отвечает на мой вопрос.

4b9b3361

Ответ 1

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

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

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

@{
    SomeClass.Method();
}

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

Ответ 2

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

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)

Ответ 3

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

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

или в случае помощника HTML

@Html.MehtodName()

Ответ 4

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

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

Ответ 5

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

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

взгляните на мой samlpe

<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');
                    }
                });
            }

Ответ 6

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

Ответ 7

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

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

Ответ 8

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

Добавьте свойство в модель представления, установите его в контроллере и используйте его в представлении.

Вот пример:

MyViewModel.cs:

public class MyViewModel
{   ...
    public bool ShowAdmin { get; set; }
}

MyController.cs:

public ViewResult GetAdminMenu()
    {
        MyViewModelmodel = new MyViewModel();            

        model.ShowAdmin = userHasPermission("Admin"); 

        return View(model);
    }

MyView.cshtml:

@model Proj.ViewModels.MyViewModel


@if (@Model.ShowAdmin)
{
   <!-- admin links here-->
}