MVC3格式可以在TextBoxFor中为Nulllable DateTime而不更改模型

时间:2012-11-13 21:00:59

标签: c# asp.net-mvc-3 datetime formatting

我是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

1 个答案:

答案 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将数据映射到视图模型完全就像你需要它一样在你的观点。

让您的视图逻辑非常简单。避免在场合循环之外使用任何疯狂的东西,也许在这里或那里有条件。