【问题标题】:UrlHelper.Action() skipping over empty propertiesUrlHelper.Action() 跳过空属性
【发布时间】: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,属性 DateDateTime.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


【解决方案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;  

}

【讨论】:

  • 我不能这样做,它会改变SimpleModel的行为。
  • 上传处理url的action方法中的代码:/Controller/Action?SomeOtherParams=123
  • 我在帖子中解释了我需要什么。请参阅 UPD。
【解决方案2】:

如果我关注这个 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;
}

【讨论】:

  • 我描述不正确,是的,这是预期的行为。我使用这种预期的行为在构造函数中将Date 设置为默认值。问题是我无法识别用户何时选择空日期以及何时访问没有参数的页面(这种情况下Date 必须具有默认值,而不是 null)。
  • 所以,您希望Date 成为null,这样您就可以检查是否被选中,对吧?在这种情况下,这永远不会发生,因为您总是在构造函数中将Date 设置为DateTime.Now。现在,问题是通过Url.Action 方法传递Model,你会在解析模型后遇到问题。您最好将日期自己传递给Action
猜你喜欢
  • 2018-02-16
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
相关资源
最近更新 更多