以下模型有两种使用方式:
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
为空,则生成的URL不包含参数Date(/Controller/Action?SomeOtherParams=123
)。如果我关注此网址,则属性Date
为DateTime.Now
,而不是按预期为空。
如何强制将空属性传递给URL?
UPD。行动代码
public ActionResult MyAction( SimpleModel model = null )
{
if ( model.Date == null )
{
// show all
}
else
{
// show by date
}
}
实际上,而不是TextBoxFor
使用DropDownListFor
。
@Html.DropDownListFor( model => model.Date, Model.Dates)
如果他想查看所有实体,用户可以从DropDown中选择日期或将其显示为空。
如果用户提交带有空日期的表单,他会跟踪URL /Controller/Action?Date=
并获取所有实体(Date属性在构造函数中使用默认值初始化,然后用null重写)。
如果用户通过@Url.Action
从其他页面(不提交表单)通过生成的网址跟踪,则他只获得今天的实体,因为网址不包含日期参数(/Controller/Action
)。在这种情况下,Date属性在构造函数中初始化,这就是全部。
model
中的MyAction
问题永远不会等于null,我无法识别用户何时选择空日期以及何时只访问没有参数的页面。
答案 0 :(得分:1)
如果希望Date
为null,则删除在空构造函数中指定DateTime.Now的行。
public SimpleModel()
{
//This line is assigning the value to Date whenever a new SimpleModel() is created. Comment it out.
// Date = DateTime.Now;
}
答案 1 :(得分:1)
如果我关注此URL,则属性Date为DateTime.Now,而不是按预期为空。
问题是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;
}