簡體   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