c# - tutorial - mvc4




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

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

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

所以,这是我的问题:

如何从视图中调用方法?

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

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


为什么你不使用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');
                    }
                });
            }

在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)

控制器不应该从视图中调用。 这就是MVC的全部理念 - 明确区分关注点。

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


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

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

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

@{
    SomeClass.Method();
}

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





asp.net-mvc-4