【问题标题】:Calling non-Action methods from view-MVC .NET从 view-MVC .NET 调用非 Action 方法
【发布时间】:2013-09-23 21:40:15
【问题描述】:

我想在视图中调用非操作方法。我可以这样做吗?换句话说,我的控制器中有一个返回字符串的方法。我想在我的视图(.cshtml)中调用该方法并将其显示在视图中。我只能看到,这些方法应该返回一个 ActionResult。但就我而言,我不需要只返回一个字符串的视图。

【问题讨论】:

  • 您是指 Ajax 调用,还是页面加载调用?

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

如果你愿意,你可以这样做。

虽然我不会称之为好习惯。

你可以在视图上调用任何你想要的方法,但你应该尽量让你的视图保持干净,并且做你需要的最少的逻辑。

在您的控制器中,您可以使用以下方法。

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

【讨论】:

  • Controller() 的末尾需要一个分号。
  • @AmmarAhmed 谢谢……我想我错过了 :)
【解决方案2】:

您可以通过调用Html.Action() or Html.RenderAction()将视图/部分视图返回到其他视图

我个人从来不需要从不是ActionResultas there are quite a few 的基类的方法返回值。

【讨论】:

    【解决方案3】:

    这听起来像是自定义 Helper 的一个很好的用例。

    http://www.asp.net/mvc/tutorials/older-versions/views/creating-custom-html-helpers-cs

    【讨论】:

      【解决方案4】:

      您可以从控制器返回一个 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 模式!

      【讨论】:

        【解决方案5】:

        执行此操作的最佳方式(和 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*@
        

        希望有帮助!

        【讨论】:

        • 这是正确的解决方案。模型应该与视图对话。
        • 我用了上面的方法。我试图在 _layout.cshtml 中使用它,以便当用户登录此方法时返回字符串并将其显示在页面和所有后续页面上。但是,得到错误 - boldObject reference not set to an instance of an object.**bold**
        猜你喜欢
        • 2023-03-28
        • 2016-08-28
        • 1970-01-01
        • 1970-01-01
        • 2011-07-16
        • 1970-01-01
        • 2017-10-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多