1

以下のモデルは 2 つの方法で使用されます。

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)

...

また、このモデルは の 3 番目のパラメーターとして使用されますUrlHelper.Action()

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

この場合、Dateが null の場合、生成された URL にはパラメータ Date ( ) が含まれません/Controller/Action?SomeOtherParams=123。そして、この URL をたどると、プロパティDateDateTime.Now期待どおり null ではありません。

空のプロパティを URL に強制的に渡す方法は?

アップデート。アクションコード

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)

ユーザーはドロップダウンから日付を選択するか、すべてのエンティティを表示したい場合は空のままにすることができます。

ユーザーが空の Date でフォームを送信すると、URL をたどっ/Controller/Action?Date=てすべてのエンティティを取得します (Date プロパティはコンストラクターでデフォルト値で初期化され、null で上書きされます)。

ユーザー@Url.Actionが他のページから (フォームを送信せずに) 生成された URL をフォローすると、URL に日付パラメーター ( ) が含まれていないため、今日のエンティティのみが取得されます/Controller/Action。この場合、コンストラクターでの Date プロパティの初期化とこれがすべてです。

問題は決してnullに等しくないことであり、ユーザーが空の日付を選択したときと、パラメーターなしでページにアクセスしたときを認識できませんmodelMyAction

4

2 に答える 2

1

そして、このURLをたどると、プロパティDateはDateTime.Nowであり、期待どおりnullではありません。

問題は、MVCエンジンが、プロパティをにModel設定する、定義したコンストラクターに基づいてオブジェクトを構築しようとしていることです。でモデルを作成するためにMVCエンジンによって使用されるため、空のパラメーターを使用してコンストラクターを定義しないことをお勧めします。現状では、これは予想される動作です。DateDateTime.NowPOST

機能が必要な場合は、別のコンストラクターを定義します。

public SimpleModel() // Left for MVC
{
}

public SimpleModel(DateTime date) // Use as: new SimpleModel(DateTime.Now) in your action 
{
     Date = date;
}
于 2013-01-16T14:53:11.617 に答える
1

を null にする場合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;  

}
于 2013-01-16T10:46:20.383 に答える