1

下面的模型有两种使用方式:

public class SimpleModel
{
    public DateTime? Date { get; set; }

    // Some other properties

    public SimpleModel()
    {
         Date = DateTime.Now;
    }
}

当在表单中使用模型时,生成的 URL 有空参数 Date ( /Controller/Action?Date=&SomeOtherParams=123) 并且Date模型中的属性是null(在提交带有空日期的表单后)。

...

@Html.TextBoxFor(model => model.Date)

...

该模型也用作第三个参数UrlHelper.Action()

@Url.Action("Action", "Controller", Model) // Model is SimpleModel

在这种情况下,如果Date为 null,则生成的 URL 不包含参数 Date( /Controller/Action?SomeOtherParams=123)。如果我关注此 URL,则属性DateDateTime.Now,而不是预期的 null 。

如何强制将空属性传递给 URL?

UPD。动作代码

public ActionResult MyAction( SimpleModel model = null )
{
     if ( model.Date == null )
     {
        // show all
     }
     else
     {
        // show by date
     }
}

实际上,而不是TextBoxForused DropDownListFor

@Html.DropDownListFor( model => model.Date, Model.Dates)

如果他想查看所有实体,用户可以从下拉菜单中选择日期或将其留空。

如果用户提交带有空日期的表单,他会跟随 URL/Controller/Action?Date=并获取所有实体(日期属性在构造函数中使用默认值初始化,然后用 null 覆盖)。

如果用户通过@Url.Action从其他页面生成的 url(不提交表单)跟随,他只会得到今天的实体,因为 URL 不包含 Date 参数(/Controller/Action)。在这种情况下 Date 属性在构造函数中初始化,这就是全部。

问题是model从不MyAction等于 null,我无法识别用户何时选择空日期以及何时访问没有参数的页面。

4

2 回答 2

1

如果您希望Date为空,则删除在空构造函数中分配 DateTime.Now 的行。

public SimpleModel()
{
   //This line is assigning the value to Date whenever a new SimpleModel() is created. Comment it out.
   //  Date = DateTime.Now;  

}
于 2013-01-16T10:46:20.383 回答
1

如果我关注这个 URL,属性 Date 是 DateTime.Now,而不是预期的 null。

问题是 MVC 引擎正在尝试Model根据您定义的构造函数构造一个对象,该构造函数将Date属性设置为DateTime.Now. 建议您不要定义带有空参数的构造函数,因为 MVC 引擎将使用它在POST. 就目前而言,这是预期的行为。

如果您需要该功能,则定义另一个构造函数:

public SimpleModel() // Left for MVC
{
}

public SimpleModel(DateTime date) // Use as: new SimpleModel(DateTime.Now) in your action 
{
     Date = date;
}
于 2013-01-16T14:53:11.617 回答