2011-05-11 119 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