0

MVC3アプリケーションへの着信POSTリクエストで、着信リクエストパラメータを検証したいと思います。無効なパラメータが存在する場合、例外がスローされます。

次のオブジェクトがあるとします。

public class ActionRequest
{
    public string ActionRequestPassword { get; set; }
    public bool EnableNewsfeedAppPool { get; set; }
}

着信投稿リクエストで、次の方法で適切なプロパティを使用してオブジェクトを初期化します。

public class NewsfeedAppPoolController : Controller
{
    [ActionName("EnableAppPool"), AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    [NoCache]
    public ActionResult EnableAppPool(FormCollection formCollection)
    {
        Models.ActionRequest actionRequest = ValidatePOSTRequest(formCollection);

        // do things with actionRequest

        return null;
    }

    private Models.ActionRequest ValidatePOSTRequest(FormCollection formCollection)
    {
        try
        {
            Type actionRequestType = typeof(Models.ActionRequest);
            System.Reflection.PropertyInfo propertyInfo = null;
            object systemActivatorObject = Activator.CreateInstance(actionRequestType);

            foreach (var key in formCollection.AllKeys)
            {

                propertyInfo = typeof(Models.ActionRequest).GetProperty(key);
                Type t = propertyInfo.PropertyType; // t will be System.String


                if (t.Name == "Int32")
                {
                    actionRequestType.GetProperty(key).SetValue(systemActivatorObject, Convert.ToInt32(formCollection[key]), null);
                }
                else
                {
                    actionRequestType.GetProperty(key).SetValue(systemActivatorObject, formCollection[key], null);
                }
            }

            return (Models.ActionRequest)systemActivatorObject;
        }
        catch (Exception ex)
        {
            throw ex;
        } 
    }
}

これに改善が加えられるかどうか、またはこれを効率的に達成するための他の方法の推奨事項があるかどうかを知りたいと思います。

ありがとう。

4

3 に答える 3

1

リクエストパラメータからのActionRequestのインスタンス化とバインドを処理するデフォルトのモデルバインダーを使用するだけです。

public class NewsfeedAppPoolController : Controller
{
    [ActionName("EnableAppPool"), AcceptVerbs(HttpVerbs.Post)]
    [ValidateInput(false)]
    [NoCache]
    public ActionResult EnableAppPool(ActionRequest actionRequest)
    {
        // do things with actionRequest

        return null;
    }
}
于 2012-07-12T14:51:44.427 に答える
1

ASP.Net MVCは、すでにこれらすべてを実行します。アクションにパラメータを
追加するだけです。Models.ActionRequest actionRequest

検証ロジックを追加する場合は、を使用しますSystem.ComponentModel.DataAnnotations

于 2012-07-12T14:49:38.750 に答える
0

適切なパターンは、

[HttpPost]
public ActionResult Save(Employee employee)
{
  if(ModelState.IsValid)
  {
     db.Save(employee);
     RedirectToAction("Index");
  }

  return View();
}

ノート:

インスタンスは、リクエストで使用可能な値(フォーム、クエリ文字列、ルートデータなど)からデフォルトのモデルバインダーemployeeによって自動的に作成され、入力されます。

デフォルトのモデルバインダーが値をモデルにバインドすると、検証も実行され、すべてのエラーがModelStateディクショナリに保存されるため、チェックするModelState.IsValidことで、検証が成功したかどうかを知ることができます。

モデルバインディングの詳細については、こちらを参照してください。モデル検証の詳細については、こちらを参照してください。

于 2012-07-12T15:12:36.327 に答える