首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC3格式TextBoxFor中的可空DateTime,无需更改模型

MVC3格式TextBoxFor中的可空DateTime,无需更改模型
EN

Stack Overflow用户
提问于 2012-11-14 05:00:59
回答 1查看 2.6K关注 0票数 3

我是MVC3的新手,还在努力学习好的编程实践。我花了很长时间试图格式化一个DateTime?显示在我的MVC3项目中,该项目没有显式的ModelName.cs文件与日期来自的类相关联。

我们已经有了一个数据库,并使用了一个.edmx (我们的名为Pooling.edmx),我们从中获得了我们的模型。我显然不想编辑设计器文件来适应这个被广泛接受的解决方案:Date only from TextBoxFor()

然后我尝试了另一个我在这里找到的解决方案:Using Html.TextBoxFor with class and custom property (MVC)

它使用:

代码语言:javascript
复制
@Html.TextBoxFor(m => m.Name, new { data_bind="value: Name", @class = "title width-7" })

这是因为我能够一次使用自定义属性、添加类名和设置值。

我改变了这个:

代码语言:javascript
复制
@Html.TextBoxFor(m => Model.PrePoolOwner.OglDateEffective, new Dictionary<string, object> { { "class", "check-dirty input-small datePicker" }, { "data-original-value", @Model.PrePoolOwner.OglDateEffective } })

(这似乎真的是ugly...and给我引出的问题):

代码语言:javascript
复制
@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文件,它执行以下操作:

代码语言:javascript
复制
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文件的顶部调用

代码语言:javascript
复制
@model OCC_Tracker.Models.PrePoolOwnerRow
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-14 05:55:24

好了,我有几个建议。

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

所以我建议的第一件事就是更新你的视图模型,使之更像这样:

代码语言:javascript
复制
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将其映射到您的视图模型(这是一个假设示例,因为我不知道您的视图在做什么):

代码语言:javascript
复制
public ViewResult Index(int id)
{
    PrePoolOwner entity = myservice.GetPrePoolOwner(id);

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

    return View(model);
}

现在,为了解决使用MVC文本框的问题,您应该考虑使用DateTime编辑器模板(这完全是另一个主题,但是Google it可以找到涵盖该主题的许多主题)。这为您提供了更多的灵活性和可重用性,而不是呈现类似类型的元素(即DateTime)。

但是,除了使用它之外,您还可以向模型添加另一个属性,并使用AutoMapper适当地设置DateTime。所以,在你的控制器中类似这样的东西,除了你会在AutoMapper中设置一个映射来处理这个:

代码语言:javascript
复制
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;
    ....
}

设置完成后,您就可以在textbox上为属性使用这个新的模型属性(OglDateEffectiveValue)。

我知道我在这里介绍了很多内容,但请深入研究并尝试像这样对视图模型进行建模,并使用AutoMapper将数据映射到视图模型,就像您需要的那样。

保持你的视图逻辑非常简单。避免使用场合循环之外的任何疯狂的东西,并且可能在此处或那里使用if条件。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13368703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档