2011-08-05 20 views
2

MVCサイトでファイルをアップロードするとき、maxRequestLengthを上回るユーザーが一般的なカスタムエラーページを表示するよりも正常にアップロードを処理するようにしています。投稿しようとしているのと同じページを表示するのが好きですが、ファイルが大きすぎるというメッセージが表示されます。これは、検証エラーの場合と同様です。ASP.NET MVC:maxRequestLengthを超えるアップロードの処理

Catching "Maximum request length exceeded"

は、しかし、私がやりたいこと(彼らはその質問にそうであるように)代わりにエラーページに転送され、私がしたい:

私はこの質問からアイデアを始めています元のコントローラーに処理を渡しますが、問題を示すModelStateにエラーが追加されています。ここで私は何をしたいのかを示すコメントを含むコードをいくつか紹介します。 IsMaxRequestExceededEexceptionの定義については上記の質問を参照してください。これは少しハックですが、それほど良くはありません。

私がコメントアウトしましたラインは、右ページにユーザーを返しますが、当然のことながら、彼らは、彼らが作ったかもしれないと私はここにリダイレクトを使用したくない変更...

if (IsMaxRequestExceededException(Server.GetLastError())) 
{ 
    Server.ClearError(); 
    //((HttpApplication) sender).Context.Response.Redirect(Request.Url.LocalPath + "?maxLengthExceeded=true"); 
    // TODO: Replace above line - instead tranfer processing to appropriate controlller with context intact, etc 
    // but with an extra error added to ModelState. 
} 

を失います完全な解決策ではなくアイデアを探してください。私がしようとしていることは可能ですか?

答えて

0

回避策:web.configのmaxRequestLengthプロパティを高い値に設定します。

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new MyViewModel(); 
     return View(model); 
    } 

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

     // TODO: Process the uploaded file: model.File 

     return RedirectToAction("Success"); 
    } 
} 

し、最終的にビュー:あなたは、コントローラを持っている可能性が

public class MyViewModel 
{ 
    [Required] 
    [MaxFileSize(1024 * 1024, ErrorMessage = "The uploaded file size must not exceed 1MB")] 
    public HttpPostedFileBase File { get; set; } 
} 

:であなたのビューモデルを飾るために使用することができ

public class MaxFileSize : ValidationAttribute 
{ 
    public int MaxSize { get; private set; } 

    public MaxFileSize(int maxSize) 
    { 
     MaxSize = maxSize; 
    } 

    public override bool IsValid(object value) 
    { 
     var file = value as HttpPostedFileBase; 
     if (file != null) 
     { 
      return file.ContentLength < MaxSize; 
     } 
     return true; 
    } 
} 

:その後、カスタム検証属性を書きます:

@model MyViewModel 

@using (Html.BeginForm(null, null, FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    <div> 
     @Html.LabelFor(x => x.File) 
     <input type="file" name="file" /> 
     @Html.ValidationMessageFor(x => x.File) 
    </div> 

    <p><input type="submit" value="Upload"></p> 
} 
関連する問題