使用Razor的ASP.Net MVC4 - 在视图中访问控制器方法的最佳和正确方法

时间:2013-02-12 13:55:35

标签: razor asp.net-mvc-4

我一直在使用ASP.NET,但我对使用Razor概念的ASP.Net MVC 4相当新。所以我的问题可能是基本的,但我很感激每一个帮助,因为我现在几乎找不到一个明确的答案(或者我正在寻找错误的东西)。问题是:如何在不使用索引方法的情况下访问视图中的Controller方法?

情景:

  • 我有一个存储日期,价格等值的数据库......(变量在模型中定义。

  • 我有一个设置视图索引的控制器

  • 我的视图显示了包含我的数据库值的Indexpage。

我想总结价格列的所有值,但不想将结果存储在我的数据库中。 根据我的理解,我通过Controller类中的Method访问数据库,并在我的视图中调用此方法。

要逐步学习,我只是在控制器中定义了一个固定值,以了解如何在我的视图中显示此值。

代码:

Model:

[Range(1, 100)]
[DataType(DataType.Currency)]
public decimal Price { get; set; } // Amount of an entry

Controller:

     public ActionResult Index()
        {
             return View(db.Amounts.ToList());
        }

      public ActionResult ShowSumOfAllPrices()
        {

            //For testing db is not called yet. Query must be defined and result written to a variable within this mehod
            ViewBag.Price = 2;

            return View();
        }

View:

@*testmethod for displaying sumprize (first just wit test result) via controler*@


    <table>
    <tr>   
        <td>hallo @ViewBag.Price</td>
    </tr>
    </table>

只要我没有在ShowSumOfAllPrices()方法中定义index()(在我的控制器类中)的方法内容,结果就不会显示。

问题是:如果我在控制器中的Index()方法中定义了一个方法,那么视图中的方法的结果是否只有可见,或者我可以像我一样编写一个额外的方法并在我的视图中调用它吗?如果我将ShowSumOfAllPrices()的逻辑与Index()联系起来,它就会起作用。但我认为我不需要在索引方法中定义所有内容。如果是这样,那将是一个庞大而肥胖的方法。因此,据我所知,有三种可能的方式,但并非所有方式都可能“好”甚至有效:

  1. Index()方法中定义所有内容。
  2. 定义其他方法,但在Index方法中调用它们,因为它是在我的视图中显示它而不使用模型的唯一方法,因为我不想将这些数据存储在我的数据库中
  3. 我可以定义其他方法,并在我的视图中直接调用它们,而不需要新页面,但只有当前索引页面内容下显示的此方法的结果。
  4. 我希望我的问题是可以理解的,这个问题之前没有像我这样被问过。

1 个答案:

答案 0 :(得分:0)

  

在Index()方法中定义所有内容。

控制器并不意味着掌握逻辑。

  

定义其他方法,但在Index方法中调用它们,因为它是在我的视图中显示它而不使用模型的唯一方法,因为我不想将这些数据存储在我的数据库中

不要在控制器本身中定义其他方法。创建其他类,然后在Index()或任何合适的控制器方法中调用这些方法。如果您想在视图中显示数据,那么模型是最佳选择,但您甚至可以将数据存储在ViewBag

  

我可以定义其他方法,并在我的视图中直接调用它们,而不需要新页面,但只有当前索引页面内容下显示的此方法的结果。

如果你想在同一个视图中获取方法的结果,那么可能是[可能使用相同类型的AJAX],但如果你想渲染其他页面,那么这可能是一个坏主意。 / p>

你可以做的最好的事情是将所需函数的类声明为单一责任原则,然后使用该类在你想要获得结果的方法中执行该操作。你可以使用AJAX和JQuery访问控制器方法,只需稍微谷歌,你将成为自己的。

希望这有帮助。