我正在尝试为DateTime字段创建一个编辑器模板,它似乎不尊重我的DisplayFormat属性.
我的模特:
public class Project
{
[Display(Name="Project Name")]
[Required]
public string ProjectName { get; set; }
[Display(Name="Start Date")]
[DisplayFormat(DataFormatString="{0:M/d/yyyy}", ApplyFormatInEditMode=true)]
public DateTime? StartDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我的编辑器模板在/Views/Projects/EditorTemplates/DateTime.cshtml文件夹中
@model DateTime?
@Html.TextBoxFor(m => Model, new { @class="datepicker" })
Run Code Online (Sandbox Code Playgroud)
以下是将所有内容联系在一起的视图:
@model Project
<fieldset>
<legend>Project</legend>
<div class="editor-label">
@Html.LabelFor(m => m.ProjectName)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.ProjectName)
@Html.ValidationMessageFor(m => m.ProjectName)
</div>
<div class="editor-label">
@Html.LabelFor(m => m.StartDate)
</div>
<div class="editor-field">
@Html.EditorFor(m => m.StartDate)
@Html.ValidationMessageFor(m => m.StartDate)
</div>
</fieldset>
Run Code Online (Sandbox Code Playgroud)
当我这样的时候,我看到了约会的时间部分.当我删除编辑器模板然后它工作正常,只显示日期部分.当我有一个编辑模板时,为什么它似乎忽略了DisplayFormat?
我有一个模型属性,我正在尝试使用EditorFor模板进行渲染,我正在尝试使用DisplayFormat属性应用格式.然而,它根本不起作用 - 它完全被忽略了.
这是我的模板:
@model System.Decimal?
@Html.TextBoxFor(m => m)
Run Code Online (Sandbox Code Playgroud)
这是我的模型:
[DisplayFormat(ApplyFormatInEditMode = true, DataFormatString = "{0:0.00}")]
public decimal? Retail { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是我的观点:
@Html.EditorFor(m => m.Retail)
Run Code Online (Sandbox Code Playgroud)
但它呈现的文本框具有以下值:
189.9900
它似乎非常直接,但它不起作用,我不知道为什么.
更新: 只是为了踢,我尝试使用DisplayFor模板,它工作:
@Html.DisplayFor(m => m.Retail)
Run Code Online (Sandbox Code Playgroud)
那么,当我设置ApplyFormatInEditMode为true 时,为什么DisplayFor模板可以工作,而不是EditorFor模板呢?
更新2: 没关系,工作的原因是因为我的十进制显示模板被硬编码为格式化.所以我的显示模板也不起作用.
asp.net-mvc decimal mvc-editor-templates asp.net-mvc-3 displayformat
我有一个编辑器模板位置:
地区/职位/查看/共享/ EditorTemplates/Question.cshtml
我也有一个:
/Views/Shared/EditorTemplates/Question.cshtml
对于两者,模型是相同的.
我想要做的是在该Posts区域的视图中,在该区域中调用我的编辑器模板,设置一些HTML,然后冒泡回到主共享编辑器模板.
这是PostsEditorTemplate:
@model xxx.ViewModels.QuestionViewModel
@Html.Hidden("Id", (byte)Model.QuestionType)
@Html.EditorForModel()
Run Code Online (Sandbox Code Playgroud)
但它只是渲染了隐藏字段,而不是共享编辑器模板的内容.
如果我删除了Posts编辑器模板,则会正确呈现共享模板.
我猜MVC/Razor认为这是递归的还是什么?就像我调用相同的模板?
有什么方法我可以告诉它去共享的吗?
本质上,我正在尝试在共享模板中重用HTML,但是注入了一些我自己的偷偷摸摸的HTML.
在MVC中,您可以为其创建编辑器模板T,然后当您想要为类型属性渲染编辑器时,IEnumerable<T>您可以简单地执行此操作
Html.EditorFor(m => m.MyListOfT)
Run Code Online (Sandbox Code Playgroud)
这样做的好处是,输入框架会自动创建名称,然后在回发模型绑定时,所有工作都很好.
我的问题是:当你有多种类型的编辑器模板时,你如何做到这一点?
我尝试过使用UIHint(),但它似乎只允许您针对列表指定UIHint,而不是列表中的每个项目.这意味着您必须使用foreach()循环为列表创建EditorTemplate,然后您错过了良好的自动命名和模型绑定.
我在这里错过了什么?
该模型是例如
public class MyViewModel
{
public IEnumerable<SomeType> SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我想做的事情如下:
public class MyViewModel
{
[UIHint("SomeTypeTemplate")]
public IEnumerable<SomeType> SomeProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并自动应用于列表中的所有元素,以便我可以使用以下内容进行渲染:
Html.EditorFor(m => m.SomeProperty)
Run Code Online (Sandbox Code Playgroud) 我是ASP.NET MVC的新手,如果这比它看起来更容易,那么道歉.我一直在谷歌搜索,我有一个这样的课:
public class Search : IAuditable
{
[Key]
public int SearchID { get; set; }
public int UserID { get; set; }
...
public ICollection<SearchTerm> SearchTerms { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在Create.cshtml中,我有以下内容
<div class="editor-label">
@Html.LabelFor(model => model.Search.SearchTerms)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Search.SearchTerms, "SearchTerm")
@Html.ValidationMessageFor(model => model.Search.SearchTerms)
</div>
Run Code Online (Sandbox Code Playgroud)
SearchTerm EditorTemplate是一个简单的表单,如下所示:
@model Core.Search.Parameters.SearchTerm
@Html.HiddenFor(n => n.SearchTermID)
<div class="editor-label">
@Html.LabelFor(n => n.Text, "Term")
</div>
<div class="editor-field">
@Html.EditorFor(n => n.Text)
@Html.ValidationMessageFor(n => n.Text)
</div>
Run Code Online (Sandbox Code Playgroud)
它似乎工作,我在创建时看到一个文本框(默认模型为空时).不过,我想要做的是能够添加/删除SearchTerms与 …
只是想知道人们如何以及何时使用编辑器/显示模板与Html助手.具体来说,我在谈论它用于渲染不同的UI控件而不是渲染实体.
例如,我有类似下面的atm:
<tr>
<th><%= Html.LabelFor(x => x.ActivityTypeId) %></th>
<td><%= Html.EditorFor(x => x.ActivityTypeList, "MultiSelectDropDownList")%></td>
</tr>
<tr>
<th><%= Html.LabelFor(x => x.Name) %></th>
<td><%= Html.EditorFor(x => x.Name) %></td>
</tr>
<tr>
<th><%= Html.LabelFor(x => x.Description) %></th>
<td><%= Html.DisplayFor(x => x.Description, "DisplayString")%></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
但是最近我想知道我是否应该这样做:
<tr>
<th><%= Html.LabelFor(x => x.ActivityTypeId) %></th>
<td><%= Html.MultiSelectDropDownList(x => x.ActivityTypeList)%></td>
</tr>
<tr>
<th><%= Html.LabelFor(x => x.Name) %></th>
<td><%= Html.EditorFor(x => x.Name) %></td>
</tr>
<tr>
<th><%= Html.LabelFor(x => x.Description) %></th>
<td><%= Html.DisplayString(x => x.Description)%></td>
</tr>
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用第二个选项是使用中间编辑器的重点...我将使用Html.Textbox,并且能够设置我喜欢的任何html属性.
我对人们在这里使用的模式感兴趣...有什么想法吗?
干杯安东尼
如何在ASP.NET MVC 2(RTM)编辑器模板中正确注册javascript块?
我所处的特定场景是我想将Dynarch JSCal2 DateTimePicker用于我的标准日期时间选择器,但这个问题通常适用于任何可重用的javascript包.我的模板现在正常工作,但我的主页中包含了我的JS和CSS,如果我真的需要它,我宁愿只包含这些东西:
<link rel="stylesheet" type="text/css" href="../../Content/JSCal2-1.7/jscal2.css" />
<link rel="stylesheet" type="text/css" href="../../Content/JSCal2-1.7/border-radius.css" />
<script type="text/javascript" src="../../Scripts/JSCal2-1.7/jscal2.js"></script>
<script type="text/javascript" src="../../Scripts/JSCal2-1.7/lang/en.js"></script>
Run Code Online (Sandbox Code Playgroud)
所以很明显我可以把这些行放到我的模板中,但是如果我有一个有5个DateTimePickers的屏幕,那么这个内容将重复5次,这是不理想的.无论如何,我仍然希望我的视图模板触发此代码被放入<head>我的页面.
虽然这与我提出这个问题完全无关,但我想我会在这里(到目前为止)分享我的模板,以防它以任何方式有用:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<DateTime>" %>
<%= Html.TextBoxFor(model => Model) %>
<input type="button" id="<%= ViewData.TemplateInfo.GetFullHtmlFieldId("cal-trigger") %>" value="..." />
<script type="text/javascript">
var <%= ViewData.TemplateInfo.GetFullHtmlFieldId("cal") %> = Calendar.setup({
trigger : "<%= ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) %>",
inputField : "<%= ViewData.TemplateInfo.GetFullHtmlFieldId(string.Empty) %>",
onSelect : function() { this.hide(); },
showTime : 12,
selectionType : Calendar.SEL_SINGLE,
dateFormat : '%o/%e/%Y %l:%M %P' …Run Code Online (Sandbox Code Playgroud) 要在我的编辑视图中呈现HTML,我使用帮助器@Html.EditorForModel().
我的模特:
[Required(ErrorMessage = "Campo obrigatório")]
[Display(Name = "Nome completo")]
public string Name { get; set; }
[Required(ErrorMessage = "Campo é obrigatório")]
[StringLength(100, ErrorMessage = "A {0} deve ter pelo menos {2} characteres.", MinimumLength = 6)]
[DataType(DataType.Password)]
[Display(Name = "Senha")]
public string Password { get; set; }
[DataType(DataType.Password)]
[Display(Name = "Confirmar senha")]
[Compare("Password", ErrorMessage = "A nova senha e a confirmação da senha não conincidem.")]
public string ConfirmPassword { get; set; }
[Required(ErrorMessage = "Campo obrigatório")]
[Display(Name = …Run Code Online (Sandbox Code Playgroud) scaffolding mvc-editor-templates data-annotations razor asp.net-mvc-3
我试图找到关于如何将剃刀编辑器模板合并到项目中的文档或示例.另一个线程上的以下答案可能会解决我遇到的问题,但我不知道如何将其纳入我的项目中.毫无疑问这很简单.
这里是我不知道如何合并的解决方案: 输入类型日期的客户端验证不起作用
我已经覆盖了默认的编辑器模板(Object.ascx)以生成表单(正文)HTML,该表格遵循Twitter Bootstrap的指南(http://twitter.github.io/bootstrap/base-css.html#forms)执行通过Html.EditorForModel().
@if (ViewData.TemplateInfo.TemplateDepth > 1)
{
@(Model == null ? ViewData.ModelMetadata.NullDisplayText : ViewData.ModelMetadata.SimpleDisplayText)
}
else
{
foreach (var property in ViewData.ModelMetadata.Properties.Where(m => m.ShowForEdit @*&& m.ModelType != typeof (System.Data.EntityState)*@ && !m.IsComplexType && !ViewData.TemplateInfo.Visited(m)))
{
if (property.HideSurroundingHtml)
{
@Html.Editor(property.PropertyName)
}
else
{
<div class="control-group @(!ViewData.ModelState.IsValidField(property.PropertyName) ? "error" : ViewData.ModelState.ContainsKey(property.PropertyName) ? "success" : "" )">
@if (!string.IsNullOrEmpty(Html.Label(property.PropertyName).ToHtmlString()))
{
@Html.Label(property.GetDisplayName() + (property.IsRequired ? " *" : ""), new { @class = "control-label" })
}
<div class="controls">
@Html.Editor(property.PropertyName)
@Html.ValidationMessage(property.PropertyName, "*", new { …Run Code Online (Sandbox Code Playgroud)