UrlHelper.Action()跳过空属性

时间:2013-01-16 10:43:21

标签: asp.net-mvc urlhelper

以下模型有两种使用方式:

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)。如果我关注此网址,则属性DateDateTime.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,我无法识别用户何时选择空日期以及何时只访问没有参数的页面。

2 个答案:

答案 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;
}