2013-01-16 64 views
1

以下兩種方式使用的模型:UrlHelper.Action()跳過空屬性

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

    // Some other properties 

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

當模型在形式使用,生成的URL具有空參數日期(/Controller/Action?Date=&SomeOtherParams=123)和模型Date屬性是null(提交空白日期後的表格)。

... 

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

... 

同樣在該模型中UrlHelper.Action()用作第三個參數:

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

在這種情況下,如果Date爲空,生成的URL不包含參數日期(/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) 

用戶可以從下拉列表中選擇日期或活空,如果他想看到的所有實體。

如果用戶提交表單的日期爲空,他會跟着URL /Controller/Action?Date=並獲取所有實體(Date屬性在構造函數中使用默認值初始化,然後用null重寫)。

如果用戶通過@Url.Action從其他頁面(未提交表單)生成的網址跟隨,他僅獲得今天的實體,因爲URL不包含Date參數(/Controller/Action)。在這種情況下,Date屬性在構造函數中初始化,這是全部。

問題是modelMyAction永遠不會等於空,我不能識別當用戶選擇空日期,當他只是訪問頁面沒有參數。

+0

我覺得很骯髒的解決方案:'@ Url.Action( 「行動」, 「控制器」,型號)&日期='會產生'/Controller/Action?SomeOtherParams = 123&Date =' –

回答

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; 

} 
+0

我不能這樣做,它會改變'SimpleModel'行爲。 –

+0

在處理url的action方法中上傳代碼:'/ Controller/Action?SomeOtherParams = 123' – robasta

+0

我解釋了我在帖子中需要的內容。查看UPD。 –

1

如果我下面這個網址,財產日期是DateTime.Now,不是空預期。

的問題是,MVC引擎試圖構造基於您定義的構造函數,它的Date屬性設置爲DateTime.Now一個Model對象。建議您不要使用空參數定義構造函數,因爲它將被MVC引擎用於在POST上創建模型。就目前來看,這是預期的行爲。

如果您需要的功能,然後定義另一個構造:

public SimpleModel() // Left for MVC 
{ 
} 

public SimpleModel(DateTime date) // Use as: new SimpleModel(DateTime.Now) in your action 
{ 
    Date = date; 
} 
+0

我描述不正確,是的,這是預期的行爲。而且我使用這個預期的行爲來在構造函數中設置具有默認值的Date。問題是我無法識別當用戶選擇空日期,當他只是訪問頁面沒有參數(這種情況下'日期'必須有默認值,非空)。 –

+0

所以,你想'日期'爲'空',所以你可以檢查是否被選中或沒有,對吧?在這種情況下,這將永遠不會發生,因爲您始終在構造函數中將Date設置爲DateTime.Now。現在,問題是通過'Url.Action'方法傳遞'Model',因爲解析模型會遇到問題。你最好將自己的日期傳遞給「行動」。 – rae1