如何从javascript文件直接指向.cshtml视图? 例如,为什么我不能使用angular.js的.cshtml视图? 就像在这个例子中一样:
.directive('encoder', ($timeout) => {
return {
restrict: 'E',
transclude: true,
scope: 'isolate',
locals: { service: 'bind' },
templateUrl: 'encoderTemplate.cshtml' // <-- that's not possible?
}
});
当然可以有一个返回你想要的动作方法,但我很好奇是否可以直接引用剃刀视图。
答案 0 :(得分:10)
如评论中所述,您无法直接提供.cshtml文件,但是,如果您愿意,可以使用控制器呈现内容:
public class TemplateController : Controller
{
// create a ~/Views/Template/Encoder.cshtml file
public PartialViewResult Encoder()
{
return PartialView();
}
}
然后像@Url.Action
一样引用它:
{
....
templateUrl: '@Url.Action("Encoder", "Template")'
}
来自评论
如果您拥有Razor访问权限之外的大部分JavaScript代码(例如外部.js文件),您仍然可以利用Url构建器,只需稍微改变一下即可。例如,我可能会这样做:
public class TemplateController : Controller
{
// Add a child method to the templates controller that outputs default
// configuration settings (and, since it's a child action, we can re-use it)
[ChildActionOnly]
public PartialViewResult Index()
{
// You could build a dynamic IEnumerable<ConfigRef> model
// here and pass it off, but I'm just going to stick with a static view
return PartialView();
}
}
<强>〜/查看/模板/ Index.cshtml 强>
<script type="text/javascript">
if (typeof window.App === 'undefined'){
window.App = {};
}
App.Templates = {
Encoder: '@Url.Action("Encoder", "Template")',
Template1: '@Url.Action("Template1", "Template")',
Template2: '@Url.Action("Template2", "Template")'
};
</script>
@*
the template files would then reference `App.Templates.Encoder`
when they need access to that template.
*@
@Scripts.Render("~/js/templating")
Index.cshtml (或任何视图)
@* ... *@
@{ Html.RenderAction("Index", "Template"); }
@* ... *@
答案 1 :(得分:6)
另一种选择是:
1.使用EncoderTemplate视图添加TemplatesController
public class TemplatesController : Controller
{
public ActionResult EncoderTemplate()
{
return View();
}
}
2.将Layout = null添加到EncoderTemplate.schtml视图
@{
Layout = null;
}
<div>Your html goes here</div>
3.指向EncoderTemplate.schtml,如下所示
.directive('encoder', ($timeout) => {
return {
restrict: 'E',
transclude: true,
scope: 'isolate',
locals: { service: 'bind' },
templateUrl: '/Templates/EncoderTemplate' // you should not add .schtml
}
});