ASP.Net MVC: вызов метода из представления
В моем приложении MVC контроллер получает данные (модель) из внешнего API (поэтому не используется класс модели) и передает это представление. У данных (модели) есть контейнер, в котором есть несколько объектов с несколькими полями (строковые значения). Один просмотр выполняет итерацию по каждому объекту и вызывает другой вид для рисования каждого из них. Это представление выполняет итерацию по полям (строковые значения) и рисует их.
Здесь, где мне становится сложно. Иногда я хочу сделать специальное форматирование в полях (строковые значения). Я мог бы написать 20 строк кода для форматирования, но тогда я должен был бы сделать это для каждого поля, и это было бы просто глупо и о так уродливо. Вместо этого я хотел бы взять поле (строковое значение), передать его методу и вернуть другое значение строки. А затем сделайте это для каждого поля.
Итак, вот мой вопрос:
Как вызвать метод из представления?
Я понимаю, что я могу задавать здесь неправильный вопрос. Ответ, вероятно, в том, что я этого не делаю, и что я должен использовать локальную модель и десериализовать объект, который я получаю от внешнего API, до моей локальной модели, а затем, в моей локальной модели, сделать "специальное форматирование" до того, как я пройду это к мнению. Но я надеюсь, что каким-то образом я могу вызвать метод из представления. В основном потому, что для преобразования настраиваемого объекта, который я получаю из API, который, в свою очередь, содержит множество других настраиваемых объектов, создается много накладных расходов для локальных пользовательских объектов, которые я создаю. Кроме того, я не уверен, что лучший способ сделать это.
Отказ от ответственности: я знаю об аналогичном потоке "ASP.NET MVC: вызов метода контроллера из представления" (ASP.NET MVC: вызов метода контроллера из представления), но я не вижу, как это отвечает на мой вопрос.
Ответы
Ответ 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-->
}