我在MVC中有以下模型:
public class ParentModel
{
public string Property1 { get; set; }
public string Property2 { get; set; }
public IEnumerable<ChildModel> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
当我想显示父模型的所有子项时,我可以这样做:
@Html.DisplayFor(m => m.Children)
Run Code Online (Sandbox Code Playgroud)
然后我可以创建一个ChildModel.cshtml显示模板,DisplayFor将自动遍历列表.
如果我想为IEnumerable创建自定义模板怎么办?
@model IEnumerable<ChildModel>
<table>
<tr>
<th>Property 1</th>
<th>Property 2</th>
</tr>
...
</table>
Run Code Online (Sandbox Code Playgroud)
如何创建具有模型类型的显示模板,IEnumerable<ChildModel>然后在@Html.DisplayFor(m => m.Children)没有抱怨模型类型错误的情况下调用?
我有一个编辑器模板,在该编辑器模板中,我想调用具有相同模型的另一个编辑器模板(即嵌套),但似乎没有显示.
即.\ EditorTemplates\Template1.cshtml
@model foo
// insert code here to edit the default fields.
// display extra fields via another editor template.
@Html.EditorForModel("Template2") // or @Html.EditorFor(m => m, "Template2")
Run Code Online (Sandbox Code Playgroud)
和\ EditorTemplates\Template2.cshtml
@model foo
@Html.TextBoxFor(m => m.Name)
Run Code Online (Sandbox Code Playgroud)
我相信有人会质疑为什么?好吧,只有满足条件时才会显示嵌套模板(即@if(@ Model.IsConditionMet){....}),但为了简单起见,我将其从原型中删除了.
我为一个Comment类创建了一个DisplayTemplate ,并将其放在里面Comment/DisplayTemplates/Comment.cshtml.
Comment.cshtml 输入正确:
@model Comment
Run Code Online (Sandbox Code Playgroud)
然后,我有一个局部视图,需要一个IEnumerable<Comment>模型.在那里,我遍历集合,并希望使用DisplayTemplate为Comment类.该观点,其完整性:
@model IEnumerable<Comment>
@foreach (var comment in Model.Where(c => c.Parent == null)) {
@Html.DisplayFor(model => comment)
}
Run Code Online (Sandbox Code Playgroud)
但是,我收到错误Html.DisplayFor:
传递到字典中的模型项的类型为"System.Int32",但此字典需要"System.String"类型的模型项.
如何为foreach循环中的每个项调用DisplayTemplate ?
如何创建显示模板,以便我可以显示bool为是或否不是复选框?使用mvc3
<%: Html.DisplayFor(model => model.SomeBoolean)%>
Run Code Online (Sandbox Code Playgroud) 我正在尝试为购物篮商品列表制作自定义模板.我需要一些不同的模板,因为我有不同的方式来显示项目,具体取决于它是在网页上还是在邮件中.现在我的问题是,当我使用默认名称时,它可以完美地运行.
@Html.DisplayFor(b => b.Items)
Run Code Online (Sandbox Code Playgroud)
但是当我尝试添加模板名称时,我得到了一个预测,我的模板需要是一个列表类型IEnumerable而不是BasketItem.
@Html.DisplayFor(i => basket.Items, "CustomerItemBaseList")
Run Code Online (Sandbox Code Playgroud)
任何想法,我的错误,或为什么不可能被赞赏.谢谢.
当我使用嵌套显示模板并通过HTML帮助器添加输入元素时,Razor引擎会在字段名称中添加前缀.
我知道这样做是为了保证页面级别的输入名称唯一性(并在后期重建整个模型).
但是我有许多小型表单执行临时操作,我既不需要名称唯一性也不需要重建整个模型的能力.
我只需要单个属性值,并且当我提交其中一个表单时让Razor更改输入项名称会破坏模型绑定器,因为所有名称都不同.
此示例包含简化的嵌套模型
public class Student
{
public Guid Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public List<Course> Courses { get; set; }
}
public class Course
{
public Guid Id { get; set; }
public string Name { get; set; }
public List<Grade> Grades { get; set; }
}
public class Grade
{
public Guid Id { get; set; }
public DateTime Date { get; …Run Code Online (Sandbox Code Playgroud) 我想只为字符串属性创建一个显示模板,并为所有其他属性使用default.
我试图在Views/Shared/DisplayTemplates中创建一个string.cshtml,其中包含以下内容:
@model string
@Html.TextBoxFor(m => m, new { @readonly = "readonly" })
Run Code Online (Sandbox Code Playgroud)
我现在有一个问题,当我尝试打开任何使用DisplayFor(m => m.property)的视图时,它显示如下错误:传递到字典中的模型项是'System.DateTime'类型,但是这个字典需要一个'System.String'类型的模型项.或:传递到字典中的模型项的类型为"System.Int64",但此字典需要"System.String"类型的模型项.
我知道我可以通过为每种使用的类型添加显示模板来解决这个问题,但我想对于没有定义自定义模板的所有类型,我也可以使用"默认"模板吗?
更新 Darin的回答后,我检查了Brad的教程并将模板更改为:
@Html.TextBox("", ViewData.TemplateInfo.FormattedModelValue, new { @readonly = "readonly" })
Run Code Online (Sandbox Code Playgroud)
这基于"默认"模板,适用于所有类型.
我试图实现的首要要求是显示注释(在列表中逐项进行).
我在创作方面添加了该功能,方法是在列表上启用版本控制,并添加一个文本字段,其中选项"将更改添加到现有文本"设置为true.这确实允许我对项目进行评论并按时间顺序显示它们,但仅限于创作方.问题是UI部分将在另一个网站集上完成,我找不到一种简单的方法来获取所有评论.
到目前为止,我发现的每一种资源都指向了
<SharePoint:AppendOnlyHistory runat="server" FieldName="YourCommentsFieldName" ControlMode="Display"/>
Run Code Online (Sandbox Code Playgroud)
问题是,我不能(不知道如何)在显示模板中使用它.到目前为止,我通过REST API获取所有数据
var siteUrl=_spPageContextInfo.webAbsoluteUrl.replace("publishing","authoring");
$.ajax({
url: siteUrl + "/_api/web/lists/getbytitle('" + listname + "')/items(" + id + ")",
type: 'GET',
async:false,
headers: {"accept": "application/json;odata=verbose",},
dataType: 'JSON',
success: function(json) {
console.log(json);
//var obj = $.parseJSON(JSON.stringify(json.d.results));
//alert(obj);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("error :"+XMLHttpRequest.responseText);
}
});
Run Code Online (Sandbox Code Playgroud)
这给我的是最新的评论.我需要一个简单的方法来获取整个线程.
如果我有这样的ViewModel:
public class MyViewModel
{
[UIHint("SomeTemplate")]
public ICollection<SomeViewModel> Submodel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
一个带有一行HTML 的强类型视图,如下所示:
@Html.DisplayFor(model => model.Submodel)
Run Code Online (Sandbox Code Playgroud)
以及带有如下签名的显示模板:
@model MvcApplication1.Models.SomeViewModel
Run Code Online (Sandbox Code Playgroud)
我得到一个错误说"模型项是类型的,List<SomeViewModel>但这个字典需要一个类型的模型SomeViewModel.".
这是有道理的,但我希望MVC的内置模板智能会启动,看到它是一个IEnumerable东西,并努力调用我的模板N次,就像Html.DisplayFor没有提示通常做的那样.
所以它看起来像[UIHint]覆盖了那个功能?
显然,我可以指向另一个接受集合的模板,并调用Html.DisplayForModel(),基本上模拟MVC智能.但我希望避免这种情况.老实说,我宁愿做一个foreach循环而不是那个1行"包装"模板.
有更好的想法吗?
这就像我想说的那样:"嘿MVC,为这些家伙中的每一个人渲染一个模板.但是不是使用name-convention来找到模板,这里有一个提示".
asp.net-mvc data-annotations razor display-templates asp.net-mvc-3
我在liferay 6.2上工作了应用程序显示模板,我使用freemarker帮助分页liferay的动态数据列表.当我升级到liferay 7时,这是一个问题.Liferay 7使用代码<#assign records = ddlDisplayTemplateHelper.getRecords(reserved_record_set_id)>获取记录.
旧代码:
<#assign DDLRecordLocalService = serviceLocator.findService("com.liferay.portlet.dynamicdatalists.service.DDLRecordLocalService")> <#assign records = DDLRecordLocalService.getRecords(reserved_record_set_id)> <#assign totalRecord = DDLRecordLocalService.getRecordsCount(reserved_record_set_id, 0) >
它不起作用.
所以我尝试<#assign serviceLocator = staticUtil["com.liferay.portal.template.ServiceLocator"]>但staticUtil得到一个错误.
以下评估为null或缺失:==> staticUtil [在模板"20115#20159#21387"第9行,第27列]提示:如果已知失败的表达式合法地引用有时为null或缺失的内容
在portal-ext.properties中我添加了:
freemarker.engine.restricted.classes=
freemarker.engine.restricted.packages=
freemarker.engine.restricted.variables=
Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×6
razor ×5
boolean ×1
checkbox ×1
freemarker ×1
liferay ×1
liferay-7 ×1
model ×1
nested ×1