ASP.Net MVC:从视图中调用方法

doo*_*osh 56 c# asp.net-mvc asp.net-mvc-4

在我的MVC应用程序中,控制器从外部API获取数据(模型)(因此没有使用模型类)并将其传递给视图.数据(模型)有一个容器,其中有几个具有多个字段的对象(字符串值).一个视图遍历每个对象并调用另一个视图来绘制每个对象.此视图迭代字段(字符串值)并绘制它们.

这是我变得棘手的地方.有时我想在字段上做一些特殊的格式化(字符串值).我可以为格式化编写20行代码但是我必须为每个字段执行此操作,这只会是愚蠢而且非常难看.相反,我想取字段(字符串值),将其传递给方法并返回另一个字符串值.然后为每个领域做到这一点.

所以,这是我的问题:

如何从视图中调用方法?

我意识到我可能在这里问错了问题.答案可能是我没有,并且我应该使用本地模型并将从外部API获取的对象反序列化到我的本地模型,然后在我的本地模型中,在我通过之前执行"特殊格式化"它的观点.但我希望有一些方法可以从视图中调用方法.主要是因为将我从API中获取的自定义对象转换为我构建的本地自定义对象似乎需要很多开销,而API又包含许多其他自定义对象.而且,我不确定这样做的最佳方式是什么.

免责声明:我知道类似的线程"ASP.NET MVC:从视图调用控制器方法"(ASP.NET MVC:从视图调用控制器方法)但我不知道这是如何回答我的问题.

lah*_*rah 90

这是您在Controller上调用实例方法的方法:

@{
  ((HomeController)this.ViewContext.Controller).Method1();
}
Run Code Online (Sandbox Code Playgroud)

这就是你在任何类中调用静态方法的方法

@{
    SomeClass.Method();
}
Run Code Online (Sandbox Code Playgroud)

假设该方法是公共的并且视图可见,这将起作用.

  • 我不认为耶稣与语法有任何关系.但严重的是,语法很笨重,因为这项技术很笨重.你真的不应该从视图中调用控制器方法. (5认同)
  • 不过那个语法。耶稣。 (2认同)

vip*_*naz 19

在Amine的答案基础上,创建一个帮手,如:

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

在你看来:使用 @Html.CurrencyFormat(model.value)

如果您正在使用标准数字格式进行简单格式化,那么在您的视图中使用string.Format()就像在上面的帮助示例中一样:

@string.Format("{0:C2}", model.value)
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以实现静态格式化方法或 HTML 帮助程序,然后使用以下语法:

@using class_of_method_namespace
...
// HTML page here
@className.MethodName()
Run Code Online (Sandbox Code Playgroud)

或者在 HTML Helper 的情况下

@Html.MehtodName()
Run Code Online (Sandbox Code Playgroud)


Ill*_*dan 5

不应从视图中调用控制器。这就是 MVC 的全部思想——明确的关注点分离。

如果您需要从 View 调用控制器 - 您做错了什么。是时候重构了。

  • 那么,您愿意提供一些有关如何正确执行此操作的示例吗? (3认同)