Asp.net-Mvc-4

如何在 Durandal 中使用 cshtml 文件?

  • February 9, 2014

我在 VS2012 上獲得了 DurandalJS StarterKit 模板……一切都很好……

但在某些觀點中,我需要做這樣的事情:

@if (Roles.IsUserInRole("Administrators"))
{
  <p>Test</p>
}

但是,對於 durandal,我所有的視圖都是“.html”文件……是否可以使用“.cshtml”文件來訪問類似的資訊?

或者有沒有其他方法可以用 durandal 做到這一點?

初級

我這樣做是這樣的:

  1. 為 Durandal 視圖創建一個通用控制器:
public class DurandalViewController : Controller
{
 //
 // GET: /App/views/{viewName}.html
 [HttpGet]
 public ActionResult Get(string viewName)
 {
   return View("~/App/views/" + viewName + ".cshtml");
 }
}
  1. 註冊路線:
routes.MapRoute(
   name: "Durandal App Views",
   url: "App/views/{viewName}.html",
   defaults: new { controller = "DurandalView", action = "Get" }
);
  1. 將 Views/web.config 複製到 /App/views/web.config(以便 Razor 視圖在此位置工作)。

這讓我可以使用正常的 Durandal 約定(甚至是視圖的 html 副檔名),並將 durandal 視圖作為 cshtml 文件放在其正常位置,而無需添加任何更多的伺服器程式碼。

如果您還有靜態 html 視圖,您也可以將 cshtml 視圖放在子文件夾中或使用普通的 MVC /Views 文件夾。

我不建議將 ASP.NET MVC 與 Durandal 一起使用。

您可能想要做的是使用獨立於 ASP.NET MVC 存在的 Razor 視圖引擎(以獲得編譯器、強類型等的好處)。僅用於數據 I/O 的 WebAPI 就足以非常有效地創建 Durandal.js 應用程序。

如果您有興趣將Razor/CSHTML 與 Durandal 和 Knockout 一起使用,那麼有一個名為****FluentKnockoutHelpers的開源選項可能正是您正在尋找的。它提供了 ASP.NET MVC 的許多“不錯”部分,允許您使用 Durandal 和 Knockout 的強大功能,幾乎沒有失敗。

簡而言之,它提供了一系列特性,使得進行 Durandal/Knockout 開發就像 ASP.NET MVC 一樣簡單。(您只需為大多數功能提供您的 JavaScript 模型所基於的 C# 類型。)您只需為複雜的情況編寫 JavaScript 和未編譯的標記,這是不可避免的,與 MVC 沒有什麼不同!(除了在 MVC 中,您的程式碼也很可能最終也會成為一個大的 jQuery 混亂,這就是您首先使用 Durandal/Knockout 的原因!)

特徵:

  • 使用類似於 ASP.NET MVC 的強類型、流暢的 lambda 表達式助手輕鬆生成 Knockout 語法
  • 豐富的智能感知和編譯器支持語法生成
  • 流利的語法使創建自定義助手或擴展內置內容變得輕而易舉
  • OSS 替代 ASP.NET MVC 助手:隨意添加社區中每個人都可以使用的可選功能
  • 只需幾行程式碼,即可針對所有目前/未來的應用程序類型和更改輕鬆地提供基於 .NET 類型和 DataAnnotations 的驗證
  • 客戶端 JavaScript 對象工廠(基於 C# 類型)在例如列表中創建新項目,零麻煩或伺服器流量

沒有 FluentKnockoutHelpers 的範例

<div class="control-group">
   <label for="FirstName" class="control-label">
       First Name
   </label>
   <div class="controls">
       <input type="text" data-bind="value: person.FirstName" id="FirstName" />
   </div>
</div>
<div class="control-group">
   <label for="LastName" class="control-label">
       Last Name
   </label>
   <div class="controls">
       <input type="text" data-bind="value: person.LastName" id="LastName" />
   </div>
</div>
<h2>
   Hello,
   <!-- ko text: person.FirstName --><!-- /ko -->
   <!-- ko text: person.LastName --><!-- /ko -->
</h2>

為 FluentKnockoutHelpers 提供 .NET 類型,您可以使用 Intellisense 和 Razor / CSHTML 中的編譯器以風格方式執行此操作

@{
 var person = this.KnockoutHelperForType<Person>("person", true);
}

<div class="control-group">
   @person.LabelFor(x => x.FirstName).Class("control-label")
   <div class="controls">
       @person.BoundTextBoxFor(x => x.FirstName)
   </div>
</div>
<div class="control-group">
   @person.LabelFor(x => x.LastName).Class("control-label")
   <div class="controls">
       @person.BoundTextBoxFor(x => x.LastName)
   </div>
</div>
<h2>
   Hello,
   @person.BoundTextFor(x => x.FirstName)
   @person.BoundTextFor(x => x.LastName)
</h2>

查看**SourceLive Demo**以詳細了解 FluentKnockoutHelper 在不平凡的 Durandal.js 應用程序中的功能。

引用自:https://stackoverflow.com/questions/14981833