1

次のアクションがあるとしましょう

public ViewResult Products(string color)
{...}

URL「製品」をこのアクションにマップするルート。

SEOのヒントによると、リンク/products?color=redは戻る必要があります

200OK

でもリンク/products?someOtherParametr=someValue

404お探しのページが見つかりませんでした

問題は、存在しないクエリ パラメータを処理し、この場合 404 を返す方法です。

4

4 に答える 4

6

ASP.NET MVC アクションから HTTP 404 応答を送信する適切な方法は何ですか? で受け入れられた回答を検討してください。ActionResult、あなたの期待を満たすことができるスペシャルがあります。

public class HomeController : Controller
{
    public ViewResult Products(string color)
    {
        if (color != "something") // it can be replaced with any guarded clause(s)
            return new HttpNotFoundResult("The color does not exist.");
        ...
    }
}

アップデート:

public class HomeController : Controller
{
    public ViewResult Products(string color)
    {
        if (Request.QueryString.Count != 1 || 
            Request.QueryString.GetKey(0) != "color")
            return new HttpNotFoundResult("the error message");
        ...
    }
}
于 2013-08-17T08:17:27.137 に答える
5

アクション メソッドを実行する前に、これを検証します。このアプローチは、プロジェクトのすべてのコントローラーまたは特定のアクション メソッドに有効です。

コントローラ アクション メソッド

[attr]  // Before executing any Action Method, Action Filter will execute to 
        //check for Valid Query Strings.
public class ActionResultTypesController : Controller
{
    [HttpGet]
    public ActionResult Index(int Param = 0)
    {
        return View();
    }

    [HttpPost]
    public ActionResult Index(MyViewModel obj)
    {
        return View(obj);
    }

}

アクション フィルタ

public class attr : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        if (filterContext.ActionParameters.Count == 0 &&
                  System.Web.HttpContext.Current.Request.QueryString.Count > 0)
        {
              //When no Action Parameter exists and Query String exists. 
        }
        else
        {
            // Check the Query String Key name and compare it with the Action 
            // Parameter name
            foreach (var item in System.Web.HttpContext
                                       .Current
                                       .Request.QueryString.Keys)
            {
                if (!filterContext.ActionParameters.Keys.Contains(item))
                {
                    // When the Query String is not matching with the Action 
                    // Parameter
                }
            }
        }
        base.OnActionExecuting(filterContext);
    }
}

上記のコードに注目すると、以下の画面に示すように Action パラメーターをチェックしています。

ここに画像の説明を入力

渡された QueryString がアクション メソッド パラメータに存在しない場合はどうすればよいですか? このリンクに示されているように、ユーザーを別のページにリダイレクトできます。

filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary
                        {
                            {"action", "ActionName"},
                            {"controller", "ControllerName"},
                            {"area", "Area Name"},
                            {"Parameter Name","Parameter Value"}
                        });

または

このようにすることができます。OnActionExecuting以下のコードは、メソッドオーバーライドに記述されます

filterContext.Result = new HttpStatusCodeResult(404);
于 2013-08-17T09:47:50.590 に答える
1
protected override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var actionParameters = filterContext.ActionParameters.Keys;
    var queryParameters = filterContext
                                  .RequestContext
                                  .HttpContext
                                  .Request
                                  .QueryString
                                  .Keys;

    // if we pass to action any query string parameter which doesn't 
    // exists in action we should return 404 status code

    if(queryParameters.Cast<object>().Any(queryParameter 
                                 => !actionParameters.Contains(queryParameter)))
        filterContext.Result = new HttpStatusCodeResult(404);
}

実際、これをすべてのコントローラーに書きたくない場合は、DefaultControllerFactory をオーバーライドする必要があります。

于 2013-08-17T19:04:29.207 に答える