1

基本的に、エンドユーザーがドキュメントをアップロードできるようにするファイル入力のあるページがあります。

私はこのようなコントローラーを持っています

public class MyController : Controller 
{
  [HttpPost]
  public ActionResult MyAction(MyViewModel model, HttpPostedFileBase document)
  { .. }
}

私が達成したいのは、ユーザーがmaxContentLength設定よりも大きいファイルをアップロードしようとすると、検証エラーをModelStateに追加し、ユーザーが送信したフォームがあったページに戻る必要があるということです。ExceptionFilterでエラーを処理し、カスタムページにリダイレクトすることは解決策ではありません。

4

1 に答える 1

3

設定を超えるリクエストは送信できませんmaxContentLength。Webサーバーは、アプリケーションに到達する前にこの要求を強制終了し、このエラーを処理する可能性を提供します。したがって、それを処理したい場合は、の値をmaxContentLength適度に大きな数に増やしてから、コントローラーアクション内ContentLengthでアップロードされたファイルのを確認する必要があります。

[HttpPost]
public ActionResult MyAction(MyViewModel model, HttpPostedFileBase document)
{ 
    if (document != null && document.ContentLength > MAX_ALLOWED_SIZE)
    {
        ModelState.AddModelError("document", "your file size exceeds the maximum allowed file size")
        return View(model);
    }

    ...
}

しかし、明らかにはるかにクリーンな解決策は、ビューモデルでこれを直接処理することです。HttpPostedFileBase引数は必要ありません。これが、ビューモデルの対象です。

public class MyViewModel
{ 
    [MaxFileSize(MAX_ALLOWED_SIZE)]
    public HttpPostedFileBase Document { get; set; }

    ... some other properties and stuff
}

ここで、MaxFileSizeは明らかに、簡単に実装できるカスタム属性です。

そして今、あなたのPOSTアクションはより標準的になります:

[HttpPost]
public ActionResult MyAction(MyViewModel model)
{ 
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    ...
}

私が書いた次の例を見てください。

于 2012-07-09T13:06:11.700 に答える