我最近一直在寻找ASP.NET MVC框架中的最佳实践,特别是关注的关注.我的问题是,如果我在模型上有属性,那么在该属性上进行某些格式化的最佳位置在哪里?
我想过几个选项,但不确定哪个是最好的.该示例使用DateTime.对不起,这有点长.
选项1:
在视图中:@Model.TheDate.String("{0:'blah'dd/MM/yyyy}")
我知道这不对,因为格式字符串不应该在这里(如果我想在整个应用程序中更改格式怎么办)
选项2:
视图中使用的扩展方法:@Model.TheDate.DisplayItNicePlease()
这种方式很有意义,因为视图正在选择用于格式化的扩展方法,而viewmodel只是将date属性公开给视图.不确定视图或视图模型是否应该负责格式化.
选项3: 在Html Helper方法中,例如,我应该在ASP.NET MVC 3中放置声明性HTML帮助器,以便您可以使用:
@Html.DisplayDateNice(Model.TheDate)
Run Code Online (Sandbox Code Playgroud)
选项4: 视图模型上的额外属性,以格式化它并返回一个字符串,例如:
public string TheDateStr
{
get
{
return TheDate.DisplayItNicePlease();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在视图中你就拥有了
@Model.TheDateStr
Run Code Online (Sandbox Code Playgroud)
与选项3非常相似,只是它保持视图真实,非常简单 - 视图只是输出模型中的内容而不关心数据的格式.
选项5: DisplayFormat属性,例如:在视图模型上:
[DisplayFormat(DataFormatString = "{0:'blah'dd/MM/yyyy}")]
public DateTime TheDate { get; set; }
Run Code Online (Sandbox Code Playgroud)
然后在视图上:
@Html.DisplayFor(m => m.TheDate)
Run Code Online (Sandbox Code Playgroud)
我喜欢这个,除了格式字符串不再使用,所以带上选项5 ......
选项6:
某种习惯,DisplayFormatAttribute例如NiceDateDisplayFormatAttribute.在我看来,这可能是最好的解决方案,如果您只想要一个简单的字符串格式化,那么效果很好.我认为如果你想要更复杂的东西会变得更复杂,例如显示相对时间(计算C#中的相对时间),在这种情况下,最好是在扩展方法/ html助手中.
可能还有其他方法我甚至都不知道......
我正在处理的项目在域模型中有大量的货币属性,我需要格式化这些属性$#,###.##以便传输到视图和从视图传输.我已经对可以使用的不同方法有了一些看法.一种方法可能是在视图中显式格式化值,如Steve Michelotti的"Pattern 1":
......但这很快就开始违反DRY原则.
首选方法似乎是在DomainModel和ViewModel之间的映射期间进行格式化(根据ASP.NET MVC的Action第4.4.1节和"Pattern 3").使用AutoMapper,这将导致一些代码如下所示:
[TestFixture]
public class ViewModelTests
{
[Test]
public void DomainModelMapsToViewModel()
{
var domainModel = new DomainModel {CurrencyProperty = 19.95m};
var viewModel = new ViewModel(domainModel);
Assert.That(viewModel.CurrencyProperty, Is.EqualTo("$19.95"));
}
}
public class DomainModel
{
public decimal CurrencyProperty { get; set; }
}
public class ViewModel
{
///<summary>Currency Property - formatted as $#,###.##</summary>
public string CurrencyProperty { get; set; }
///<summary>Setup mapping between domain and view model</summary> …Run Code Online (Sandbox Code Playgroud) 我有一个 Razor for 循环:
@foreach (var user in Model.Users)
{
<p class="active-text">Active: @user.LastActive</p>
}
Run Code Online (Sandbox Code Playgroud)
我刚刚安装了 moment.js 来使用 js 格式化这个 DateTime() 日期。
如何将 Razor 模型传递给 javascript 函数?我确实有这个页面的 JS 视图模型,我只是想避免序列化整个模型,因为我需要将一些 JS 应用于单个字段。我的 viewModel 现在如何站立:
<script type="text/javascript">
$(document).ready(ko.applyBindings(new SubjectVm()));
</script>
Run Code Online (Sandbox Code Playgroud) 我试图通过在模型类中设置但未获得所需结果来格式化 asp.net MVC 5 中的日期。请查看以下日期:
10/10/2010 12:00:00 上午
我想按以下格式更改上述日期:-
2014 年 10 月 10 日
请在下面查看我的模型类
[DisplayFormat(DataFormatString = "{0:MMM-dd-yyyy}", ApplyFormatInEditMode = true)]
[Required(ErrorMessage = "Date is required")]
public DateTime? DateOfBirth { get; set; }
Run Code Online (Sandbox Code Playgroud)
上面的代码没有按照要求的格式进行格式化。另请查看下面的代码,其呈现方式如下表所示。
foreach (var m in Model)
{
<tr style="height: 22px; border-bottom: 1px solid silver">
<td style="width: 150px">@m.StudentId</td>
<td style="width: 150px">@m.FirstName</td>
<td style="width: 150px">@m.LastName</td>
<td style="width: 150px">@m.DateOfBirth</td>
</tr>
Run Code Online (Sandbox Code Playgroud)
所以我也尝试了下面的代码,但仍然无法正常工作。
<td style="width: 150px">@m.DateOfBirth.ToString("MMM/dd/yyyy")</td>
Run Code Online (Sandbox Code Playgroud)
如果我的代码中缺少某些内容,请更正,谢谢