我有两个编辑器模板:一个用于十进制,一个用于十进制?(可为空的)
但是当我的模型中有一个可以为空的小数时,它会尝试加载普通的十进制编辑器:
<%: Html.EditorFor(model => model.SomeDecimal )%>
<%: Html.EditorFor(model => model.SomeNullableDecimal )%>
Run Code Online (Sandbox Code Playgroud)
第一个工作正常,并加载十进制编辑器模板.第二个也尝试加载十进制模板(并且因为它不是十进制字段而失败).
错误消息是:
The model item passed into the dictionary is null, but this dictionary requires
a non-null model item of type 'System.Decimal'.
Run Code Online (Sandbox Code Playgroud)
我的模板声明如下:
十进制模板:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal>" %>
Run Code Online (Sandbox Code Playgroud)
可空的十进制模板:
<%@ Control Language="C#"
Inherits="System.Web.Mvc.ViewUserControl<System.Decimal?>" %>
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过传递模板名称来使其工作,例如
但我真的更喜欢它只是像所有其他模板一样使用类型自动工作.
<%: Html.EditorFor(model => model.SomeNullableDecimal,
"NullableDecimalTemplate" )%>
Run Code Online (Sandbox Code Playgroud) c# asp.net-mvc mvc-editor-templates editortemplates asp.net-mvc-2
我@Html.EditorForModel()在所有观点上使用帮助器.
他希望在我的模型中跳过两个字段,但只有在这个视图中,另一个他必须像往常一样继续显示这些字段.
如何才能在此视图中跳过这两个字段?
我正在使用带有Razor和C#的ASP.NET MVC3.我正在制作各种表单构建器,所以我有一个具有以下对象集合的模型:
public class MyFormField
{
public string Name { get; set; }
public string Value { get; set; }
public MyFormType Type { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
MyFormType只是一个枚举,告诉我表单字段是复选框,文本框,文件上传,还是其他什么.我的编辑器模板看起来像这样(请参阅注释):
〜/查看/ EditorTemplates/MyFormField.cshtml
@model MyFormField
@{
switch (Model.Type)
{
case MyFormType.Textbox:
@Html.TextBoxFor(m => m.Value)
case MyFormType.Checkbox:
@Html.CheckBoxFor(m => m.Value) // This does not work!
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试m.Value在CheckBoxFor()的lambda表达式中转换/转换为bool,但是这引发了错误.我只是手动构造一个复选框输入,但CheckBoxFor()似乎做了两件我似乎无法复制的事情:
有没有人知道在字符串上使用CheckBoxFor()的方法,或者手动复制其功能的方法,以便我可以使这个工作?
通常我通过@ Html.RenderModel渲染我的表单,但这次我有一个复杂的渲染逻辑,我手动渲染它.我决定为一个属性创建一个编辑器模板.这是代码(从默认对象编辑器模板实现粘贴的副本):
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>
<% var modelMetadata = ViewData.ModelMetadata; %>
<% if (modelMetadata.HideSurroundingHtml) { %>
<%= Html.Editor(modelMetadata.PropertyName) %>
<% } else { %>
<% if (!String.IsNullOrEmpty(Html.Label(modelMetadata.PropertyName).ToHtmlString())) { %>
<div class="editor-label"><%= Html.Label(modelMetadata.PropertyName) %></div>
<% } %>
<div class="editor-field">
<%= Html.Editor(modelMetadata.PropertyName) %>
<%= Html.ValidationMessage(modelMetadata.PropertyName) %>
</div>
<% } %>
Run Code Online (Sandbox Code Playgroud)
以下是我如何使用它:
@Html.EditorFor(x => x.SomeProperty, "Property") //"Property" is template above
Run Code Online (Sandbox Code Playgroud)
但它不起作用:无论DisplayName如何都会呈现标签,并且根本不呈现编辑器(在Watches Html.Editor中(modelMetadata.PropertyName显示空字符串).我做错了什么?
假设我有一个LineItem(来自过度使用的购物车示例),我想使用EditorTemplate渲染它.
我很好地使用来自父视图(部分或其他)的@ Html.EditorFor(m => m.LineItems)渲染它,但令人困惑的是传递一些额外数据的最佳方法(比如具有数据的SelectList)从数据库进入)到模板.
显然,我不应该通过添加这些无关项目来污染LineItem模型(但是从视图的角度来看这是必需的.)
在尝试使用ViewBag/ViewData技巧之前,我试图看看是否有一种强类型的方法.
我尝试创建一个'LineItem'特定的视图模型来传递数据,但是它会破坏MVC生成的名称,并向集合中添加一个额外的层(因为我将viewmodel的IEnumerable <>传递给EditorFor( )调用,而不是实际LineItem的IEnumerable <>
另外,这是对EditorTemplate的错误使用吗?LineItem是否需要下拉列表,其中包含来自数据库表的选项对于EditorTemplate来说太多了?
请引导我走向MVC必杀技.在我等待答案的同时,我会尝试其他想法!
澄清一下:我考虑使用EditorTemplate的原因是因为它为我提供了自动收集处理.否则整个[id]业务变得太粘.
我正在尝试使用EditorTemplate在父视图的表中显示子集合.我遇到的问题是,如果模板的名称与子类的名称完全相同,这似乎只能起作用.当我尝试使用名称略有不同的模板,并将该名称作为templateName参数传递给EditorFor时,我收到运行时错误.我希望我可以使用相同的子集合将不同的子EditorTemplates用于不同的目的.这是一个简短的例子:
楷模:
public class Customer
{
int id { get; set; }
public string name { get; set; }
public List<Order> Orders { get; set; }
}
public class Order
{
public int id { get; set; }
public DateTime orderdate { get; set; }
public decimal amount { get; set; }
public Customer customer { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
客户控制器Index()方法:
public ActionResult Index()
{
Customer customer = new Customer() {id = 1, name = "Acme Corp.", Orders = new …Run Code Online (Sandbox Code Playgroud) 使用MVC 4,我能够将视图的编辑器模板放入视图的文件夹中:AwesomeApp/Views/UserMgmt/EditorTemplates/UserSettings.cshtml.
现在我使用的是ASP.NET Core MVC 6,它找不到编辑器模板.我必须把它们放进去AwesomeApp/Views/Shared/EditorTemplates/UserSettings.cshtml.需要配置什么,所以我不必将所有编辑器模板都放在这个文件夹中?
我正在使用最新版本的Telerik用于ASP.NET MVC的Kendo UI.但我想这是应用程序本身的一部分.
最好的问候,Carsten
我发现这篇关于MVC的Display和EditorTemplates的帖子:
http://www.growingwiththeweb.com/2012/12/aspnet-mvc-display-and-editor-templates.html
它创建一个显示模板,以便轻松显示使用货币符号格式化的十进制.
示例中使用的模型:
public class TestModel
{
public decimal Money { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
显示模板:
查看/共享/ DisplayTemplates/decimal.cshtml:
@model decimal
@{
IFormatProvider formatProvider =
new System.Globalization.CultureInfo("en-US");
<span class="currency">@Model.ToString("C", formatProvider)</span>
}
Run Code Online (Sandbox Code Playgroud)
在我的网站上,我有一个帮助类,其中有一个方法可以从小数中检索格式化的货币字符串,所以我会用以下内容替换上面的内容:
@model decimal
@(MyHelperClass.GetCurrencyString(Model))
Run Code Online (Sandbox Code Playgroud)
最后我们想要查看格式化货币的视图:
@model TestModel
@Html.DisplayFor(e => e.Money)
Run Code Online (Sandbox Code Playgroud)
输出:
<span class="currency">$3.50</span>
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地实现这一点.但当然我有不同的观点,我想查看格式化的货币.但在某些情况下,我不想显示货币符号.
我现在的问题是我应该如何实现这个小变化而不会过多的代码.
这是我目前的实施:
我已将显示模板更改为:
@model decimal
@{
bool woCurrency = (bool)ViewData["woCurrency"];
}
@(MyHelperClass.GetCurrencyString(Model)Model,woCurrency))
Run Code Online (Sandbox Code Playgroud)
当然我也改为GetCurrencyString方法来接受这个附加属性.
在我看来,我现在也必须提供这个属性:
@Html.DisplayFor(m => m.Money, new { woCurrency = true })
Run Code Online (Sandbox Code Playgroud)
所以实际上我所做的一切都应该有效.但不知何故,我不喜欢这种使视图更复杂的解决方案.
我的问题:有没有其他方法可以实现这样的东西?或者有什么建议可以优化我目前的溶出度?
谢谢!
model-view-controller asp.net-mvc mvc-editor-templates asp.net-mvc-templates
我有一个编辑器模板位置:
地区/职位/查看/共享/ 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.