我是MVC3的新手,我仍然在努力学习优秀的编程实践。我有一段时间试图格式化DateTime如何?正在我的MVC3项目中显示,该项目没有与日期来自的类关联的显式ModelName.cs文件。
我们已经有一个数据库,并使用.edmx(我们称之为Pooling.edmx),我们从中获取模型。我显然不想编辑设计器文件以适应这个广为接受的解决方案:Date only from TextBoxFor()。
然后我尝试了另一个我在这里找到的解决方案:Using Html.TextBoxFor with class and custom property (MVC)
使用:
@Html.TextBoxFor(m => m.Name, new { data_bind="value: Name", @class = "title width-7" })
这很有效,因为我能够使用自定义属性,添加类名,并一次设置一个值。
我改变了这个:
@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new Dictionary<string, object> { { "class", "check-dirty input-small datePicker" }, { "data-original-value", @Model.PrePoolOwner.OglDateEffective } })
进入这个(这看起来真的很丑......并引出了我的问题):
@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new { data_original_value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null, @class = "datePicker check-dirty", @Value = Model.PrePoolOwner.OglDateEffective.HasValue ? Model.PrePoolOwner.OglDateEffective.Value.ToString("MM/dd/yyyy") : null })
查找和使用这些其他方法(如下划线将转换为破折号等)以显示信息是否更好?或者我是否应该使用ModelName.cs文件来更改它在模型级别的显示方式?< / p>
出于某种原因,我觉得有一个巨大的Pooling.edmx文件,它映射了我们的数据库,现在限制了我们,将来我们将如何随着网站的发展访问/呈现/更改数据。
要获得Model.PrePoolOwner.OglDateEffective上面调用的“PrePoolOwner”对象,我们有一个PrePoolOwnerRow.cs文件:
namespace OCC_Tracker.Models
{
public class PrePoolOwnerRow
{
public bool Dirty { get; set; }
public bool Delete { get; set; }
public PrePoolOwner PrePoolOwner { get; set; }
public PrePoolOwnerRow(PrePoolOwner owner)
{
this.Dirty = false;
this.Delete = false;
this.PrePoolOwner = owner;
}
public PrePoolOwnerRow()
{ }
}
}
然后我们在.cshtml文件的顶部调用
@model OCC_Tracker.Models.PrePoolOwnerRow
答案 0 :(得分:1)
好的,一些建议。
首先,在您的示例中,PrePoolOwnerRow
是您的视图模型。这本身就没问题。但代码气味是您通过视图模型PrePoolOwner
公开PrePoolOwnerRow
- 域实体的位置。
首先,我建议将视图模型更新为更像这样的内容:
public class PrePoolOwnerModel
{
public bool Dirty { get; set; }
public bool Delete { get; set; }
public DateTime? OglDateEffective { get; set; }
public String OglDateEffective { get; set; }
// Other public properties here that map to properties on your PrePoolOwner entity.
}
我在这里所做的就是删除对域模型的引用,并将其替换为(一个占位符注释)模型中属性的视图。
在您的控制器中,获取您的PrePoolOwner模型,并使用AutoMapper将其映射到您的视图模型(这是一个假设的示例,因为我不知道您的视图在做什么):
public ViewResult Index(int id)
{
PrePoolOwner entity = myservice.GetPrePoolOwner(id);
PrePoolOwnerModel model = Mapper.Map<PrePoolOwnerModel>(entity);
return View(model);
}
现在,为了解决日期时间文本框的问题,你应该看一下使用MVC编辑器模板(这是另一个主题,但Google it可以找到涵盖主题的许多主题)。与渲染相似类型的元素(即DateTime)相比,这为您提供了更大的灵活性和可重用性。
但是,除了使用它之外,您还可以向模型添加另一个属性,并使用AutoMapper来适当地设置DateTime。所以,在你的控制器中这样的东西,execpt你会在AutoMapper中设置一个映射来处理这个:
public class PrePoolOwnerModel
{
....
public String OglDateEffectiveValue { get; set; }
....
}
public ViewResult Index(int id)
{
....
model.OglDateEffectiveValue = model.OglDateEffective.HasValue ?
model.OglDateEffective.Value.ToString("MM/dd/yyyy") :
String.Empty;
....
}
设置完成后,您可以在文本框中使用此新模型属性(OglDateEffectiveValue
)作为属性。
我知道我在那里有很多内容,但是深入研究并尝试建模这样的视图模型,并使用AutoMapper将数据映射到视图模型完全就像你需要它一样在你的观点。
让您的视图逻辑非常简单。避免在场合循环之外使用任何疯狂的东西,也许在这里或那里有条件。