【发布时间】:2013-09-23 21:40:15
【问题描述】:
我想在视图中调用非操作方法。我可以这样做吗?换句话说,我的控制器中有一个返回字符串的方法。我想在我的视图(.cshtml)中调用该方法并将其显示在视图中。我只能看到,这些方法应该返回一个 ActionResult。但就我而言,我不需要只返回一个字符串的视图。
【问题讨论】:
-
您是指 Ajax 调用,还是页面加载调用?
我想在视图中调用非操作方法。我可以这样做吗?换句话说,我的控制器中有一个返回字符串的方法。我想在我的视图(.cshtml)中调用该方法并将其显示在视图中。我只能看到,这些方法应该返回一个 ActionResult。但就我而言,我不需要只返回一个字符串的视图。
【问题讨论】:
如果你愿意,你可以这样做。
虽然我不会称之为好习惯。
你可以在视图上调用任何你想要的方法,但你应该尽量让你的视图保持干净,并且做你需要的最少的逻辑。
在您的控制器中,您可以使用以下方法。
public string GetName(string name)
{
return string.Format("<strong>{0}</strong>", name);
}
在您看来,您可以按如下方式使用它。
@{var c = new Controller();}
@c.GetName("My Name") //some other place in your view
【讨论】:
您可以通过调用Html.Action() or Html.RenderAction()将视图/部分视图返回到其他视图
我个人从来不需要从不是ActionResult、as there are quite a few 的基类的方法返回值。
【讨论】:
这听起来像是自定义 Helper 的一个很好的用例。
http://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs
【讨论】:
您可以从控制器返回一个 Json 对象,如下所示:
[HttpPost]
public ActionResult YourFunction()
{
return Json(new { stringContent = "Your String content here!" });
}
然后您可以像这样从您的 .cshtml 进行 ajax 调用:
$.ajax(
{
url: '/YourController/YourFunction',
type: 'POST',
success: function (data) {
$("#SomeElement").html(data.stringContent);
},
error: function () {
alert("error");
}
});
不建议从您的视图中调用控制器中的方法,因为您正在破坏 MVC 模式!
【讨论】:
执行此操作的最佳方式(和 MVC 约定方式)是使用ViewModel。快速示例:
型号
public class MyViewModel {
public string StringValue { get; set; }
}
控制器
public class MyController : Controller
{
public ActionResult MyView()
{
var model = new MyViewModel
{
StringValue = CallMyMethod()
}
return View(model);
}
}
查看
@model MyViewModel @*(use fully qualified namespace)*@
@Model.StringValue @*<-- this will print it out on the view*@
希望有帮助!
【讨论】: