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