繁体   English   中英

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

[英]ASP.Net MVC: Calling a method from a view

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

这对我来说很棘手。 有时我想对字段(字符串值)进行一些特殊的格式化。 我可以为格式编写 20 行代码,但是我必须为每个字段都这样做,这将是愚蠢的,哦,太丑陋了。 相反,我想获取该字段(字符串值),将其传递给一个方法并返回另一个字符串值。 然后对每个领域都这样做。

所以,这是我的问题:

如何从视图调用方法?

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

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

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

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

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

@{
    SomeClass.Method();
}

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

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

如果您正在执行像Standard Numeric Formats这样的简单格式化,那么在您的视图中简单地使用string.Format() ,就像上面的帮助器示例一样:

@string.Format("{0:C2}", model.value)

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

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

或者在 HTML Helper 的情况下

@Html.MehtodName()

不应该从视图中调用控制器。 这就是 MVC 的全部理念——清晰的关注点分离。

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

为什么你不使用Ajax

它很简单,不需要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');
                    }
                });
            }

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

我尝试了 lashrah 的答案,在稍微改变语法后它就起作用了。 这对我有用:

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

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

向视图模型添加一个属性,在控制器中设置它,然后在视图中使用它。

这是一个例子:

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 MyProj.ViewModels.MyViewModel


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

..\Views\Shared\ _Layout.cshtml:

    @using MyProj.ViewModels.Common;
....
    <div>    
        @Html.Action("GetAdminMenu", "Layout")
    </div>

我认为直接从视图调用控制器操作或类方法可能会产生解除锁定问题,因为它会在这里使用 UI 线程。如果我错了,请纠正我。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM