C#-ASP.Net MVC:从VI调用方法

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

这对我来说很棘手。 有时我想对字段(字符串值)进行一些特殊的格式化。 我可以编写20行代码来进行格式化,但随后我将不得不为每个字段执行该操作,这将很愚蠢,而且如此丑陋。 相反,我想获取字段(字符串值),将其传递给方法并获取另一个字符串值。 然后针对每个领域执行此操作。

所以,这是我的问题:

如何从视图中调用方法?

我意识到我在这里可能会问错问题。 答案可能是我不知道,我应该使用本地模型并将从外部API获得的对象反序列化为本地模型,然后在本地模型中通过“特殊格式化” 它到视图。 但是我希望有某种方法可以代替我从视图中调用方法。 通常是因为将我从API中获得的自定义对象转换成我构建的本地自定义对象似乎很麻烦,该API又包含许多其他自定义对象。 而且,我不确定这样做的最佳方法是什么。

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

doosh asked 2019-11-15T17:17:59Z
8个解决方案
89 votes

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

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

这是您在任何类中调用静态方法的方式

@{
    SomeClass.Method();
}

假设该方法是公共的并且对视图可见,那么它将起作用。

lahsrah answered 2019-11-15T17:18:36Z
19 votes

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

您认为:使用@Html.CurrencyFormat(model.value)

如果您正在执行标准数字格式之类的简单格式设置,则可以像上面的帮助程序示例一样,在视图中简单使用string.Format():

@string.Format("{0:C2}", model.value)
viperguynaz answered 2019-11-15T17:19:12Z
4 votes

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

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

或使用HTML Helper

@Html.MehtodName()
Amine Chafai answered 2019-11-15T17:19:46Z
4 votes

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

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

Illidan answered 2019-11-15T17:20:18Z
2 votes

为什么不使用page refresh

它简单,不需要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');
                    }
                });
            }
Basheer AL-MOMANI answered 2019-11-15T17:21:12Z
1 votes

您应该创建自定义帮助程序,仅用于更改字符串格式(使用控制器调用除外)。

tkestowicz answered 2019-11-15T17:21:39Z
1 votes

我尝试了lashrah的答案,并且在稍微更改了语法后仍然有效。这对我有用:

@(
  ((HomeController)this.ViewContext.Controller).Method1();
)
bthn answered 2019-11-15T17:22:03Z
0 votes

您不应从视图中调用控制器。

将属性添加到视图模型,在控制器中进行设置,然后在视图中使用它。

这是一个例子:

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-->
}
live-love answered 2019-11-15T17:22:57Z
translate from https://stackoverflow.com:/questions/15398177/asp-net-mvc-calling-a-method-from-a-view