【发布时间】:2013-01-16 10:43:21
【问题描述】:
以下模型有两种使用方式:
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)。如果我关注这个 URL,属性 Date 是 DateTime.Now,而不是预期的 null。
如何强制将空属性传递给 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)
如果他想查看所有实体,用户可以从下拉菜单中选择日期或将其留空。
如果用户提交带有空日期的表单,他会跟随 URL /Controller/Action?Date= 并获取所有实体(日期属性在构造函数中使用默认值初始化,然后用 null 覆盖)。
如果用户通过 @Url.Action 从其他页面(未提交表单)关注生成的 url,他只会获得今天的实体,因为 URL 不包含日期参数(/Controller/Action)。在这种情况下 Date 属性在构造函数中初始化,这就是全部。
问题是MyAction 中的model 永远不等于null,我无法识别用户何时选择空日期以及何时访问没有参数的页面。
【问题讨论】:
-
我找到了非常肮脏的解决方案:
@Url.Action( "Action", "Controller", Model )&Date=将生成/Controller/Action?SomeOtherParams=123&Date=
标签: asp.net-mvc urlhelper