标签: mvc-editor-templates

ASP.NET MVC 2 - Html.Editor对于可以为空的类型?

我有两个编辑器模板:一个用于十进制,一个用于十进制?(可为空的)

但是当我的模型中有一个可以为空的小数时,它会尝试加载普通的十进制编辑器:

<%: 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

12
推荐指数
1
解决办法
9906
查看次数

使用帮助程序@ Html.EditorForModel()忽略一些字段

@Html.EditorForModel()在所有观点上使用帮助器.

他希望在我的模型中跳过两个字段,但只有在这个视图中,另一个他必须像往常一样继续显示这些字段.

如何才能在此视图中跳过这两个字段?

asp.net-mvc models mvc-editor-templates razor asp.net-mvc-3

12
推荐指数
2
解决办法
3984
查看次数

如何让Html.CheckBoxFor()在字符串字段上工作?

我正在使用带有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()似乎做了两件我似乎无法复制的事情:

  1. 创建一个隐藏的输入,以某种方式由复选框填充.这似乎是模型绑定器的选择.
  2. 从对象生成名称,以便模型绑定器将值获取到正确的属性中.

有没有人知道在字符串上使用CheckBoxFor()的方法,或者手动复制其功能的方法,以便我可以使这个工作?

c# asp.net-mvc mvc-editor-templates razor asp.net-mvc-3

12
推荐指数
2
解决办法
2万
查看次数

用于属性的ASP.NET MVC编辑器模板

通常我通过@ 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显示空字符串).我做错了什么?

.net asp.net-mvc mvc-editor-templates

12
推荐指数
2
解决办法
6903
查看次数

MVC编辑/显示模板的官方"如何"?

我一直在使用MVC编辑器和显示模板,但已经意识到MVC编辑器/显示模板(Html.EditorFor()和Html.DisplayFor())的官方文档似乎很少.我发现基本的MSDN文档只显示了技术细节(这些文档本身并不是很有帮助),但我正在寻找更多的官方操作方法,有点像这个例子.

编辑/显示模板是不是一个事后的想法,并没有足够的广泛用于证明更深入的官方文档?

或者,我是盲目的,我正在寻找的是什么,我还没有找到它?

asp.net-mvc mvc-editor-templates asp.net-mvc-3

11
推荐指数
1
解决办法
2万
查看次数

将额外数据传递给EditorTemplate

假设我有一个LineItem(来自过度使用的购物车示例),我想使用EditorTemplate渲染它.

我很好地使用来自父视图(部分或其他)的@ Html.EditorFor(m => m.LineItems)渲染它,但令人困惑的是传递一些额外数据的最佳方法(比如具有数据的SelectList)从数据库进入)到模板.

显然,我不应该通过添加这些无关项目来污染LineItem模型(但是从视图的角度来看这是必需的.)

在尝试使用ViewBag/ViewData技巧之前,我试图看看是否有一种强类型的方法.

我尝试创建一个'LineItem'特定的视图模型来传递数据,但是它会破坏MVC生成的名称,并向集合中添加一个额外的层(因为我将viewmodel的IEnumerable <>传递给EditorFor( )调用,而不是实际LineItem的IEnumerable <>

另外,这是对EditorTemplate的错误使用吗?LineItem是否需要下拉列表,其中包含来自数据库表的选项对于EditorTemplate来说太多了?

请引导我走向MVC必杀技.在我等待答案的同时,我会尝试其他想法!

澄清一下:我考虑使用EditorTemplate的原因是因为它为我提供了自动收集处理.否则整个[id]业务变得太粘.

asp.net-mvc mvc-editor-templates razor asp.net-mvc-3

10
推荐指数
1
解决办法
1万
查看次数

在EditorFor中用于子对象时,MVC无法覆盖EditorTemplate名称

我正在尝试使用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)

asp.net-mvc mvc-editor-templates

10
推荐指数
1
解决办法
2895
查看次数

使用ASP.NET Core MVC 6将编辑器模板放在view的文件夹中

使用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-editor-templates kendo-asp.net-mvc asp.net-core-mvc

10
推荐指数
1
解决办法
1746
查看次数

使用MVC中的显示模板格式化货币

我发现这篇关于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

9
推荐指数
2
解决办法
2万
查看次数

我是否可以在"区域"编辑器模板中为同一模型调用"共享"编辑器模板?

我有一个编辑器模板位置:

地区/职位/查看/共享/ 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-editor-templates razor asp.net-mvc-3

8
推荐指数
2
解决办法
5339
查看次数