2011-05-11 82 views
3

我是ASP.NET MVC 3的新手,但我有一个简单的问题。 是否可以从CSHTML(Razor)页面调用Controller方法?调用控制器中的方法

实施例:

xxxControl.cs:

public String Bla(TestModel pModel) 
{ 
    return ... 
} 

index.cshtml:

@Bla(Model) <-- Error 

感谢。

更新:

谢谢@Nathan。这样做并不是一个好主意。 目标是:我需要一些模型字段的格式化字符串。但是,在哪里我把代码返回一个格式化字符串的情况下?

回答

18

视图调用位于控制器上的方法被认为是不好的做法。通常它是一个控制器动作,它填充模型并将该模型传递给视图。如果您需要对此模型进行格式化,您可以编写一个HTML助手。

public static class HtmlExtensions 
{ 
    public static IHtmlString Bla(this HtmlHelper<TestModel> htmlHelper) 
    { 
     TestModel model = htmlHelper.ViewData.Model; 
     var value = string.Format("bla bla {0}", model.SomeProperty); 
     return MvcHtmlString.Create(value); 
    } 
} 

,并在您的视图:

@Html.Bla() 
+1

谢谢。我可以在哪里插入这些代码作为最佳实践?在视图类(.cs文件)? – robertpnl 2011-05-11 07:39:23

+2

@robertpnl,我个人将html助手放在位于'Extensions'文件夹中的一个单独的类(例如'HtmlExtensions.cs')中。以下是MVC中的[HTML扩展概述](http://www.asp.net/mvc/tutorials/creating-custom-html-helpers-cs)。 – 2011-05-11 07:40:53

+0

达林,谢谢! – robertpnl 2011-05-11 07:43:27

2

这将使单元测试您的mvc网站非常困难。

您是否需要局部视图? (你究竟在做什么?)

+0

感谢。我已经添加了这个问题。 – robertpnl 2011-05-11 07:37:26

0

是的,它是可能的。

@using Nop.Web.Controllers; 
@ 
var _CatalogController = EngineContext.Current.Resolve<CatalogController>(); 
var _model = new ProductModel(); 
_model = _CatalogController.PrepareProductOverviewModel(p, true, true); 
} 

将该方法设置为公共,如果它是私人的。

即使您可以用同样的方式打电话的服务。

var _productService = EngineContext.Current.Resolve<IProductService>(); 
if (Model.SubCategories.Count > 0) 
{ 
foreach (var SubCategories in Model.SubCategories) 
{ 
int subcategoryid = SubCategories.Id;<br> 
IPagedList<Product> _products = _productService.SearchProducts(subcategoryid,0, null, null, null, 0, string.Empty, false, 0,null,ProductSortingEnum.Position, 0, 4); 
} 
i++ 
} 
+0

var _productService = EngineContext.Current.Resolve (); var _CatalogController = EngineContext.Current.Resolve (); – 2011-12-30 22:33:17

0

简单地做这样的:

xxxControl.cs操作方法:

public ActionResult YourView(TestModel pModel) { 

    //pMomdel code here 

    ViewBag.BlaResult = Bla(pModel); 
    return View(pModel); 
} 

index.cshtml:

@ViewBag.BlaResult