在我的MVC应用程序中,控制器从外部API获取数据(模型)(因此没有使用模型类)并将其传递给视图。数据(模型)有一个容器,其中有几个具有多个字段的对象(字符串值)。一个视图遍历每个对象并调用另一个视图来绘制每个对象。该视图遍历字段(字符串值)并绘制它们。
这对我来说很棘手。有时我想在字段上做一些特殊的格式化(字符串值)。我可以为格式化编写20行代码但是我必须为每个字段执行此操作,这只会是愚蠢而且非常难看。相反,我想取字段(字符串值),将其传递给方法并返回另一个字符串值。然后为每个领域做到这一点。
所以,这是我的问题:
如何从视图中调用方法?
我意识到我可能在这里提出错误的问题。答案可能是我没有,并且我应该使用本地模型并将从外部API获取的对象反序列化到我的本地模型,然后在我的本地模型中,在我通过之前执行“特殊格式化”它的观点。但我希望有一些方法可以从视图中调用方法。主要是因为将我从API中获取的自定义对象转换为我构建的本地自定义对象似乎需要很多开销,而API又包含许多其他自定义对象。而且,我不确定这样做的最佳方式是什么。
免责声明:我知道类似的线程“ASP.NET MVC:从视图调用控制器方法”(ASP.NET MVC: calling a controller method from view),但我不知道这是如何回答我的问题。
答案 0 :(得分:83)
这是您在Controller上调用实例方法的方法:
@{
((HomeController)this.ViewContext.Controller).Method1();
}
这就是你在任何类中调用静态方法的方法
@{
SomeClass.Method();
}
假设该方法是公开的并且视图可见,这将起作用。
答案 1 :(得分:18)
在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)
答案 2 :(得分:4)
您可以实现静态格式化方法或HTML帮助程序,然后使用以下语法:
@using class_of_method_namespace
...
// HTML page here
@className.MethodName()
或HTML Helper
@Html.MehtodName()
答案 3 :(得分:3)
控制器不应该从视图中调用。这就是MVC的全部理念 - 明确区分关注点。
如果你需要从View调用控制器 - 你做错了什么。重构的时间。
答案 4 :(得分:2)
为什么不使用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');
}
});
}
答案 5 :(得分:1)
除了使用控制器调用之外,您应该只为更改字符串格式创建自定义帮助程序。
答案 6 :(得分:0)
我尝试了lashrah的答案,并且在稍稍更改了语法之后就起作用了。 这对我有用:
@(
((HomeController)this.ViewContext.Controller).Method1();
)
答案 7 :(得分:0)
您不应从视图中调用控制器。
向视图模型添加属性,在控制器中进行设置,然后在视图中使用。
这里是一个例子:
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-->
}