Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TextBoxFor中的MVC3格式可为空的日期时间,无需更改型号_C#_Asp.net Mvc 3_Datetime_Formatting - Fatal编程技术网

C# TextBoxFor中的MVC3格式可为空的日期时间,无需更改型号

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:

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

我们已经有了一个数据库,并使用了一个.edmx(我们的称为Pooling.edmx),我们从中获取模型。很明显,我不想编辑设计器文件以适应此广泛接受的解决方案:

然后我尝试了另一种解决方案,我在这里找到了:

它使用:

@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;
    ....
}