我已经阅读了Scott Hanselman关于这个主题的帖子.我发现另一篇文章似乎是一种更简单的方法.第二个我决定尝试.
但是,创建EditorTemplates的第一部分对我不起作用.我复制了DateTime.ascx和TimeSpan.ascx让作者写了它们.然后我在视图中拆分字段.
<div class="editor-label">
<%= Html.LabelFor(model => model.LeaveRequest.DateOfLeave)%>
</div>
<div class="editor-field">
<div class="date-container">
<%= Html.TextBoxFor(model => model.LeaveRequest.DateOfLeave.Date)%>
</div>
<div class="time-container">
<%= Html.TextBoxFor(model => model.LeaveRequest.DateOfLeave.TimeOfDay)%>
</div>
<div class="clear">
<%= Html.ValidationMessageFor(model => model.LeaveRequest.DateOfLeave)%>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,我得到的行为与作者解释为应该发生的行为不同.这是我的结果的屏幕截图.

我必须遗漏一些东西,但我不知道是什么.我已多次阅读这篇文章,看不出我错过了什么.我猜测需要有一些东西告诉程序给我们新的EditorTemplates,但我不知道如何.
关于mvc模板和泛型有一些问题,但似乎没有任何与我正在寻找的相关.考虑以下模型:
namespace MyNamespace
{
public class ModelBase { /* Not important for example */ }
public class MyModel : ModelBase
{
public string Name { get; set; }
}
public class MyViewModel
{
public IEnumerable<ModelBase> Data { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
和控制器:
public class HomeController : Controller
{
public ActionResult Index
{
return View(new MyViewModel { Data = new List<MyModel>() })
}
}
Run Code Online (Sandbox Code Playgroud)
Razor视图Views/Home/Index.cshtml看起来像:
@model MyNamespace.MyViewModel
@Html.EditorFor(m => m.Data)
Run Code Online (Sandbox Code Playgroud)
没什么特别的.如果我想要一个显示或编辑器模板,我可以在Views/Shared/EditorTemplate下或在名为MyModel.cshtml的Views/Home/EditorTemplates下创建一个文件,它可以正确找到它.
如果我想在显示列表时为ModelBase的每个实现做些不同的事情怎么办?Mvc视图查找器将在上述任何路径中正确找到List'1.cshtml模板.但是,我需要做的是为List`1 [MyModel] .cshtml做一个模板
我似乎无法获得正确的文件命名.到目前为止我尝试过的(相对于此示例命名):
我需要在大多数MVC视图上显示JQuery UI Datepicker.所以我为Date Range创建了一个Model类:
public class DateRange
{
[DisplayName("From")]
[DataType(DataType.Date)]
public DateTime? FromDate { get; set; }
[DisplayName("To")]
[DataType(DataType.Date)]
public DateTime? ToDate { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
和编辑为它填写:
@model DateRange
@Html.LabelFor(model => model.FromDate)
@Html.TextBoxFor(model => model.FromDate, "{0:dd/MM/yyyy}", new { @class = "dateRangeFrom"})
@Html.LabelFor(model => model.ToDate)
@Html.TextBoxFor(model => model.ToDate, "{0:dd/MM/yyyy}", new { @class = "dateRangeTo"})
Run Code Online (Sandbox Code Playgroud)
并在我的EditorHookup.js文件中:
$(function ()
{
$('.dateRangeFrom').datepicker({
dateFormat: "dd/mm/yy",
onClose: function (selectedDate) {
$(".dateRangeTo").datepicker("option", "minDate", selectedDate);
}
});
$('.dateRangeTo').datepicker({
dateFormat: "dd/mm/yy",
onClose: function (selectedDate) {
$(".dateRangeFrom").datepicker("option", "maxDate", selectedDate); …Run Code Online (Sandbox Code Playgroud) 我在MVC中有以下模型:
public class IndexViewModel
{
public SubViewModel SubViewModel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在我的索引视图中,我正在执行以下操作以显示编辑器SubViewModel:
Index.cshtml
@model IndexViewModel
@Html.EditorFor(m => m.SubViewModel)
Run Code Online (Sandbox Code Playgroud)
在我的SubViewModel.cshtml文件中,我尝试执行以下操作:
EditorTemplates/SubViewModel.cshtml
@model SubViewModel
@Html.EditorForModel("SubViewModelForm")
Run Code Online (Sandbox Code Playgroud)
基本上,我想把我的编辑分成两部分.第一个编辑器模板将创建表单,而内部模板将创建所有实际表单字段.问题是内部视图永远不会被渲染.
这就像MVC意识到我已经在该模型上调用了EditorFor并阻止我再次这样做.我有办法让这个工作吗?
编辑
我以为我清楚地输出了发生的事情,但我猜不是.
我想使用两个模板来显示单个模型.在第一个模板中,我想渲染表单和提交按钮,以及一些容器div.
在第二个模板中,我想渲染所有表单域.
Index.cshtml @ Html.EditorFor(m => m.SubViewModel) - >渲染表单和容器
SubViewModel.cshtml @ Html.EditorForModel("SubViewModelForm") - >呈现表单字段
问题是第二次调用(@ Html.EditorForModel("SubViewModelForm"))似乎没有做任何事情.它根本不会呈现任何标签.它被MVC忽略了.
我想这样做的原因是因为我将使用ajax调用发布此表单.如果一切正常(模型状态有效),那么我想将JSON数据返回到视图.如果模型无效,我想只返回表单字段的局部视图.这样我就不需要再次连接所有的事件处理程序了.我只能替换表单字段而不是整个视图.
我有一个声明为类型的模型属性List<MyClass>.
public class MyModel
{
List<MyClass> MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我希望能够使用Razor模板显示/编辑属性.我的问题是,我如何命名EditorTemplate视图,以便我可以使用普通语法显示属性:
@model MyModel
@Html.DisplayFor(m => m.MyProperty)
Run Code Online (Sandbox Code Playgroud)
我知道我可以创建一个名为MyClass.cshtml的视图,用于该类型MyClass,但如何为列表创建模板?
当我在表单中使用 Html.EditorFor 助手时,我希望能够自定义标签的外观,因此我定义了一个 EditorTemplate 来做到这一点。这就是我的表单在我看来的样子:
@model Models.SimpleUserClass
@{
ViewBag.Title = "Create User";
}
<div class="row">
<div class="col-lg-6" id="FromPlaceHoler">
@using (Html.BeginForm("CreateUser", "Users"))
{
<fieldset>
<legend>Create One Way Trip</legend>
<div class="editor-label">
@Html.LabelFor(model => model.UserName)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserName)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserSurname)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserSurname)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserAge)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserAge)
</div>
<div class="editor-label">
@Html.LabelFor(model => model.UserGender)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.UserGender)
</div>
<p>
<input type="submit" value="Create" /> …Run Code Online (Sandbox Code Playgroud)如果禁用复选框,该值是否不会提交到数据库?我禁用了一个复选框,这样即使用户没有在表单的其余部分输入任何值,也至少会提交一个值。但是当我点击提交按钮时,数据库中没有条目。请帮忙
<table class="table-bordered">
<tr>
<td colspan="2">
@Html.CheckBoxFor(m => m.isUsed, new { @disabled="disabled"})
</td>
</tr>
<tr>
<td>
@Html.TextBoxFor(m => m.FirstName, @Model.isUsed ? (object)new { @class = "form-control" } : new { @class = "form-control", @disabled = "disabled" })
@Html.ValidationMessageFor(m => m.FirstName)
</td>
</tr>
Run Code Online (Sandbox Code Playgroud) 是否可以将 ASP.NET Core Web 应用程序配置为使用编译EditorTemplate到类库/单独程序集中的 razor 页面?
作为示例,以下问题详细说明了如何ViewComponent将 a 编译为类库。不幸的是,我找不到任何有关对EditorTemplate页面执行相同操作的信息。
class-library .net-assembly mvc-editor-templates asp.net-core-mvc asp.net-core
我有简单的测试模型:
public class MyModel
{
public InnerModel InnerModel { get; set; }
}
public class InnerModel
{
public int Value { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在控制器中:
public ActionResult Index()
{
var model = new MyModel();
model.InnerModel = new InnerModel { Value = 3 };
return View("MyModelView", model);
}
Run Code Online (Sandbox Code Playgroud)
MyModelView:
@model MyModel
@{
var items = new List<SelectListItem>()
{
new SelectListItem {Text = "one", Value = "1"},
new SelectListItem {Text = "two", Value = "2"},
new SelectListItem {Text = "three", Value …Run Code Online (Sandbox Code Playgroud) asp.net-mvc mvc-editor-templates html.dropdownlistfor asp.net-mvc-3
我有一个注册表单,我试图在其中放置Html.EditorFor()。
例如:
@ModelType RegisterViewModel
<othermarkup />
<div>
@Html.LabelFor(Function(m) m.ConfirmPassword, New With {.class = "required"})
<div>
@Html.PasswordFor(Function(m) m.ConfirmPassword)
@Html.ValidationMessageFor(Function(m) m.ConfirmPassword)
</div>
</div>
<div>
@Html.EditorFor(Function(m) m.AlertSettings)
</div>
<othermarkup />
Run Code Online (Sandbox Code Playgroud)
RegisterViewModel包含一个名为AlertSettings的属性(类型为AlertSettingsViewModel),AlertSettingsViewModel.vbhtml的编辑器模板如下所示:
@ModelType AlertSettingsViewModel
<othermarkup />
<div class="panel-heading">Personalized Alert Settings</div>
<div class="panel-body">
<div class="col-sm-6">
<div>
<label for="Disciplines">Disciplines</label>
@Html.ValidationMessageFor(Function(m) m.Disciplines)
@Html.CheckBoxListFor(Function(m) m.Disciplines, SelectLists.Disciplines())
</div>
<div class="visible-xs"><br /></div>
</div>
</div>
<othermarkup />
Run Code Online (Sandbox Code Playgroud)
AlertSettingsViewModel的Disciplines属性是一个整数数组。
我正在使用自定义的HtmlHelper生成复选框列表。它由以下两个方法组成(第一个调用第二个):
''' <summary>
''' Returns a checkbox for each of the provided <paramref name="items"/>.
''' </summary>
<System.Runtime.CompilerServices.Extension>
Public Function CheckBoxListFor(Of TModel, TValue)(htmlHelper As …Run Code Online (Sandbox Code Playgroud) 我有一个ClassA模型,它具有一个ClassB数组属性.
public class ClassA
{
public string ClassAProperty1 { get; set; }
public string ClassAProperty2 { get; set; }
public ClassB[] MySubCollection { get; set; }
}
public class ClassB
{
public string Prop1 { get; set; }
public string Prop2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想在表格中编辑ClassB的实例.我为ClassB创建了一个EditorTemplate,用于创建表格行.
@model ClassB
<tr>
<td>@Html.TextBoxFor(m => m.Prop1)</td>
<td>@Html.TextBoxFor(m => m.Prop2)</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
这对于ClassA的编辑视图非常有用,因为MVC会自行完成所有字段索引魔术:
@Html.TextBoxFor(m => m.ClassAProperty1)
@Html.TextBoxFor(m => m.ClassAProperty2)
<table>
<tr>
<th>Col</th>
<th>Col</th>
</tr>
@Html.EditorFor(m => m.MySubCollection)
</table>
Run Code Online (Sandbox Code Playgroud)
但是,我实际上想为包含表标记的数组创建一个编辑器模板,如下所示:
@model ClassB[]
<table>
<tr>
<th>Col</th>
<th>Col</th> …Run Code Online (Sandbox Code Playgroud) asp.net-mvc ×8
c# ×2
html-helper ×2
razor ×2
.net ×1
asp.net ×1
asp.net-core ×1
checkbox ×1
datetime ×1
generics ×1
jquery ×1
jquery-ui ×1
razor-2 ×1
vb.net ×1