C# TextBoxFor中的MVC3格式可为空的日期时间,无需更改型号
我是MVC3新手,仍在努力学习良好的编程实践。我花了很长时间试图格式化日期时间?显示在我的MVC3项目中,该项目没有与日期来源的类关联的显式ModelName.cs文件 我们已经有了一个数据库,并使用了一个.edmx(我们的称为Pooling.edmx),我们从中获取模型。很明显,我不想编辑设计器文件以适应此广泛接受的解决方案: 然后我尝试了另一种解决方案,我在这里找到了: 它使用:C# TextBoxFor中的MVC3格式可为空的日期时间,无需更改型号,c#,asp.net-mvc-3,datetime,formatting,C#,Asp.net Mvc 3,Datetime,Formatting,我是MVC3新手,仍在努力学习良好的编程实践。我花了很长时间试图格式化日期时间?显示在我的MVC3项目中,该项目没有与日期来源的类关联的显式ModelName.cs文件 我们已经有了一个数据库,并使用了一个.edmx(我们的称为Pooling.edmx),我们从中获取模型。很明显,我不想编辑设计器文件以适应此广泛接受的解决方案: 然后我尝试了另一种解决方案,我在这里找到了: 它使用: @Html.TextBoxFor(m => m.Name, new { data_bind="value:
@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 } })
找到并使用这些其他方式(如下划线将转换为破折号等)来显示信息更好,还是应该使用ModelName.cs文件来更改它在模型级别的显示方式
出于某种原因,我觉得有一个庞大的Pooling.edmx文件,它映射了我们的数据库,现在和将来都会限制我们在网站发展过程中访问/呈现/更改数据的方式
要获取上面由Model.prefolowner.OglDateEffective调用的“prefolowner”对象,我们有一个prefolownerrow.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
好的,有一些建议 首先,在您的示例中,
prepolownerrow
是您的视图模型。这本身是好的。但是代码的气味就是通过视图模型,prefolownerrow
暴露prefolowner
——一个域实体的地方
因此,我建议的第一件事是将视图模型更新为类似以下内容:
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.
}
我在这里所做的只是删除对域模型的引用,并将其替换为视图所需的模型中的属性(placehold注释)
在控制器中,获取预彩色所有者模型,并使用将其映射到视图模型(这是一个假设的示例,因为我不知道您的视图在做什么):
设置好后,您可以将此新模型属性(OglDateEffectiveValue
)用于文本框上的属性
我知道我在这里介绍了很多内容,但是深入研究并尝试像这样对视图模型进行建模,并使用AutoMapper将数据映射到视图模型,就像您需要它出现在视图中一样
保持视图逻辑非常简单。避免在场合循环之外使用任何疯狂的东西,或者在此处或此处使用if条件。是否将视图绑定到.edmx模型?如果是这样的话,你永远不应该这样做——总是创建视图模型来绑定到你的MVC视图。是的,听起来你是在将视图绑定到一个域/实体模型。您应该在MVC项目中设置单独的视图模型,然后将域/实体模型映射到视图模型。阅读帮助我理解视图模型和域模型。@JeradRose(编辑问题以显示我的代码示例)-谢谢。正如我正确理解的那样:如果我们想要一个类(如上面的预着色所有者),我们需要创建一个新的模型文件,将数据库中的每个字段映射到新的模型文件,然后在.cshtml文件中使用该模型文件?OCC_Tracker是您的MVC应用程序还是您的edmx?一般来说,是的,您需要一个表示视图中数据的模型(可能与域模型[数据库]非常相似,也可能不相似)。但不要只创建与域模型相同的视图模型——只定义视图所需的内容,并以对视图有意义的方式构造视图(这可能意味着对域模型进行展平/反规范化)。查看视图和域模型之间的映射。感谢您将其讲得非常清楚!这对我很有帮助。
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.
}
public ViewResult Index(int id)
{
PrePoolOwner entity = myservice.GetPrePoolOwner(id);
PrePoolOwnerModel model = Mapper.Map<PrePoolOwnerModel>(entity);
return View(model);
}
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;
....
}