2016-11-29 22 views
1

检索考虑我的模型日期只包含:设置的格式由实体MVC

public class TheModel 
{ 
    public SQL_Table TableInModel { get; set; } 
} 

SQL_Table与实体框架(我使用SQL Server和EF)检索表。

我可以使用来获取在控制器中的表对象:

[HttpPost] 
public ActionResult ControllerName(TheModel mod) 
{ 
    mod.TableInModel = db.SQL_Table.First(); 
    return View(mod); 
} 

现在正确绑定日期视图...我想:

@Html.TextBoxFor(t => t.TableInModel.Date, "{0:dd-MM-yyyy}") 

哪种格式的日期正确,但文本框中的值在回发时丢失,无法在控制器中检索。

所以,我想这个代替:

@Html.EditorFor(t => t.TableInModel.Date) 

这正确发送日期值到我的控制器上回传,但没有格式应用上所生成的文本框中。

什么方式来格式化在这种情况下的日期,同时确保在回发中的值不丢失?

(当我尝试这在我的控制mod.TableInModel.Date日期为null)

这是我的网络输出:

My web output

+0

以何种方式是价值“失落”?这两次尝试产生的HTML是什么?它们之间有什么不同? – David

+0

在控制器中,mod.TableInModel.Date为NULL –

+0

这意味着发布的内容在某种程度上是不同的,因此您应该检查这些尝试生成的HTML以了解它们的不同之处。也许由此产生的'name'值是不同的? – David

回答

1

就再拍属性,用于这么想的正确后回来,并将其分配到控制器中的一切,这是不值得尝试的格式和retreive通过实体创建一个属性:

public class TheModel 
{ 
    public SQL_Table TableInModel { get; set; } 

    public DateTime Date {get;set;} // <- apply your format HERE 
} 

[HttpPost] 
public ActionResult ControllerName(TheModel mod) 
{ 
    mod.TableInModel = db.SQL_Table.First(); 
    mod.Date = mod.TableInModel.Date; 
} 
1

请尝试所有这些步骤。它显示格式化的日期时间并绑定并返回正确的值,但随着时间的推移,因为如果使用sql日期时间,edmx会将此值存储为日期时间。您可以删除时间,如下所示。我甚至找不到日期时间的.net日期类型。

创建SQL Server表正是:

USE [Breaz] 
GO 

/****** Object: Table [dbo].[SQL_Table] Script Date: 11/30/2016 1:34:35 PM ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE TABLE [dbo].[SQL_Table](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [TheDate] [date] NOT NULL, 
CONSTRAINT [PK_SQL_Table] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

添加数据一行

添加EDMX

这里是控制器:

public class TheModel 
{ 
    public SQL_Table TableInModel { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult IndexC() 
    { 
     BreazEntities1 db = new BreazEntities1(); 
     var mod = new TheModel(); 
     mod.TableInModel = db.SQL_Table.Find(1); 
     //the Key to this solution is that the type in sql 
     //is Date instead of DateTime or the "{0:dd-MM-yyyy}" 
     //If you insist on datetime then, even if you 
     //format the time out of the date, if you bind it 
     //back to a datetime field, the time will still be there 
     //albeit 00:00:00 
     //finds my first, by identity, row in sql_table wich has 
     //TheDate Column that are passing to view and back 
     //out to controller   
     return View(mod); 
    } 

    [HttpPost] 
    public ActionResult IndexC(TheModel sql_table) 
    { 
     //finds my first, by identity, row in sql_table wich has 
     //don't let the code advance past here 
     //we can interrogate the sql_table variable and see 
     //that the formatted date is coming back 
     var removeTime = sql_table.TableInModel.TheDate.ToShortDateString(); 

     return View(); 
    } 

这里是视图:

@{ 
    Layout = null; 
} 

@model WebApplication1.Controllers.TheModel 

<!DOCTYPE html> 

<html> 
<head> 
    <meta name="viewport" content="width=device-width" /> 
    <title>IndexC</title> 
</head> 
<body> 
    <div> 
     @using (Html.BeginForm()) 
     { 
      @Html.TextBoxFor(model => model.TableInModel.TheDate, "{0:d MMM yyyy}") 
      <input type="submit" value="Passing formatted date." /> 
     } 
    </div> 
</body> 
</html> 
+0

它很好的回答了我写的第一个paragraphe的问题,在.net框架中没有“仅限日期”类型。因此,除非进行某种工作或更改SQL部分,否则不会在MVC中管理实体数据库首先会按原样放置在HTML页面中。我要编辑你的答案,并添加另一项工作,然后我会接受它。 –