2012-11-13 44 views
3

我是MVC3的新手,我仍然试图抓住良好的编程习惯。我有一段时间试图格式化日期时间?显示在我的MVC3项目中,该项目没有与日期来自的类相关联的显式ModelName.cs文件。MVC3格式可为空TextBoxFor中的DateTime而不更改模型

我们已经有了一个数据库,并使用一个.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文件来改变它在模型级别的显示方式吗?

出于某种原因,我觉得有一个巨大的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 
+1

您是否将视图绑定到.edmx模型?如果是这样,你不应该这样做 - 总是创建视图模型绑定到你的MVC视图。 –

+0

是的,听起来像你将视图绑定到域/实体模型。您应该在MVC项目中设置单独的视图模型,然后将您的域/实体模型映射到视图模型。 –

+0

阅读[本文](http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/)帮助我理解视图模型与领域模型。 –

回答

1

好的,这么几点建议。

首先,在您的示例中,PrePoolOwnerRow是您的视图模型。这本身就很好。但代码气味是您通过您的视图模型PrePoolOwnerRow公开PrePoolOwner - 域实体的位置。

我建议所以第一件事就是更新您的视图模型的东西更是这样的:

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评论更换到)您的视图所需的模型中的属性。

在你的控制,你的抓取模式PrePoolOwner,并将其映射到使用AutoMapper您的视图模型(这是一个假设的例子,因为我不知道你的观点是这样做):

public ViewResult Index(int id) 
{ 
    PrePoolOwner entity = myservice.GetPrePoolOwner(id); 

    PrePoolOwnerModel model = Mapper.Map<PrePoolOwnerModel>(entity); 

    return View(model); 
} 

现在,为了解决DateTime文本框的问题,你应该看看使用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的数据,如您需要它是你的观点映射到您的视图模型正是实验。

保持您的查看逻辑很简单。避免在场合循环之外使用任何疯狂的东西,也许在这里或那里有条件的话。

+0

谢谢你使它非常清楚!这对我很有帮助。 – blapsley

相关问题