2

Razor ビューで ASP.NET MVC 3 を使用しています。1 つの対応するビュー (.cshtml ファイル) を持つコントローラーに 2 つのアクション メソッド (Get と Post) があります。私のアプリでは、そのビューへのアクセスを 1 年の特定の時期にのみ許可したいと考えています。これを「アクセス可能な日付範囲」と呼びましょう。アクセス可能な日付範囲外のすべての時間帯に、ページを表示する代わりにアプリがユーザーにエラー メッセージを表示するようにしたいと考えています。これについての良い方法は何ですか?コントローラ メソッドでカスタム属性を使用できますか? ロジックは 2 つのコントローラー メソッドで直接実行する必要がありますか? if適切なロジックと共にビュー ファイル内のステートメントを使用する必要がありますか? このロジックをビュー ファイルに入れることに夢中になっているわけではありません。よりクリーンなオプションを提案してください。

4

4 に答える 4

1

カスタム属性を作成することもできますが、私の好みは、自分でコントローラーにロジックを配置することです。アプリケーション内で何度も再利用することがわかっている場合にのみ、カスタム属性を使用する傾向があります。

次に、日付が特定の日付内にあるかどうかを確認し、結果に応じてさまざまなビューを開始する単純なケースです。

あなたの質問からすでに知っていると思うので、決してビューに入れるべきではありません。

于 2012-08-07T12:25:51.897 に答える
1

これを行う最も簡単な方法は、アクション メソッドにロジックを配置することです。それはビューの責任ではないので、確かにビューでそれをしないでください。このための属性を作成することもできます。再利用する予定がある場合は、間違いなくこの方法を使用します。それ以外の場合は、シンプルに保ち、ロジックをアクション メソッドに配置します。

于 2012-08-07T12:27:18.550 に答える
1

最も簡単な答えは、コントローラー内にロジックを配置することです。

public ActionResult SummerOnly()
{
   if (!(DateTime.Now > new DateTime(2012,8,8)))
       return View("Error");    

   return View("GoodView");
}
于 2012-08-07T12:29:29.720 に答える
0

1 回限りのユース ケースの場合、属性は過剰ですが、ロジックを再利用する必要がある場合は、属性が理想的です。このようなもの:

public class RestrictDate : ActionFilterAttribute
{
    private int _monthFrom ;
    private int _monthTo;

    private int _dayFrom = 1;
    private int _dayTo = 0;

    public RestrictDate(int monthFrom, int monthTo)
    {            
        _monthFrom = monthFrom;
        _monthTo = monthTo;

    }

    public RestrictDate(int monthFrom, int dayFrom, int monthTo, int dayTo)
        : this(monthFrom, monthTo)
    {
        _dayFrom = dayFrom;
        _dayTo = dayTo;
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {

        DateTime minDate = new DateTime(DateTime.Today.Year, _monthFrom, _dayFrom);

        int interval = _monthFrom <= _monthTo ? _monthTo - _monthFrom : 12 - _monthFrom  + _monthTo;

        DateTime maxDate;
        if (_dayTo == 0)
        {
            maxDate = minDate.AddMonths(interval + 1).AddDays(-1);
        }
        else
        {
            maxDate = new DateTime(DateTime.Today.Year, _monthFrom, 1).AddMonths(interval).AddDays(_dayTo - 1);
        }

        if (DateTime.Today < minDate || DateTime.Today > maxDate)
        {
            filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
            {
                controller = "Home",
                action = "Error"
            }));
        }

        base.OnActionExecuting(filterContext);
    }
}

明らかに、これは本番用のコードではありません。入力などの検証はありませんが、おわかりいただけたと思います。

于 2016-11-23T15:53:29.220 に答える