如何使用c#在MVC5中只执行一次代码的某些部分

本文关键字:一次 代码 些部 何使用 MVC5 执行 | 更新日期: 2023-09-27 18:15:29

我有一个视图,用户从他/她的计算机中选择一张照片并将其上传到Flickr。关键是,一旦按钮被单击,它将重定向到请求授权的Flickr,一旦授权过程完成,它将重定向回该操作方法。下面你可以看到一些代码,使它更清楚。

Test.cshtml:

@using (Html.BeginForm("UploadToFlickr", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))
{
    <fieldset>
        <input type="file" name="file" />
        <input type="submit" value="Upload!" />
    </fieldset>
}

HomeController.cs:

public class HomeController : Controller
{
        public static string tmpFilePath, filename, path;
        // some other methods...
        public ActionResult UploadToFlickr(HttpPostedFileBase file, FormCollection form)
        {
            tmpFilePath = Server.MapPath("~/App_Data/Uploads/Pictures");
            if (file == null || file.ContentLength == 0)
            {
                return RedirectToAction("Index");
            }
            filename = Path.GetFileName(file.FileName);
            path = Path.Combine(tmpFilePath, filename);
            if (System.IO.File.Exists(path))
            {
                System.IO.File.Delete(path);
            }
            file.SaveAs(path);
            if (Request.QueryString["oauth_verifier"] != null && Session["RequestToken"] != null)
            {
                // Flickr relevant code...
                string photoId = flickr.UploadPicture(path, "Test picture");
            }
            else
            {
                // Flickr relevant code...
                string url = flickr.OAuthCalculateAuthorizationUrl(token.Token, AuthLevel.Write);
                Response.Redirect(url);
            }
            return View("Test");
        }

关键在于,我已经将tmpFilePath、filename和path变量定义为静态变量,如您所见。当我点击上传按钮时,首先它调用UploadToFlickr方法,它执行最初的代码行,然后进入else,它将应用程序重定向到Flickr授权,然后当我点击授权时,它再次生成一个包含UploadToFlickr方法的URL,它再次调用该方法,但这次文件参数为空,它进入部分return RedirectToAction("Index");。有什么办法,我能解决这个问题吗?我需要的部分,直到if的情况下被执行只是一次,只有当按钮被点击。这不是我第二次从Flickr重定向了

如何使用c#在MVC5中只执行一次代码的某些部分

回调最有可能使用HTTP GET而不是HTTP POST。将您的操作拆分为两个方法,并用[HttpPost][HttpGet]装饰您发布的方法。[HttpPost]方法应该只在用户点击上传按钮时调用(因为FormMethod被设置为Post),因此该方法应该只负责验证他们上传的文件并将其传递给Flickr。Flickr完成它的事情后,如果它回调到你的应用,它应该调用[HttpGet]功能,在那里你可以重定向或做任何你想做的事情。我不太熟悉Flickr API,但这应该能让你接近。

请记住,上传图片和从Flickr获得回调是对应用程序的两个完全独立的请求。您需要根据两个唯一请求的HTTP请求方法、提供的参数等来确定要做什么。

public class HomeController : Controller
{
    public static string tmpFilePath, filename, path;
    // some other methods...
    [HttpGet]
    public ActionResult UploadToFlickr()
    {
        // This method will probably get called back by Flickr
        return RedirectToAction("Index");
    }
    [HttpPost]
    public ActionResult UploadToFlickr(HttpPostedFileBase file, FormCollection form)
    {
        // This method will only be called when the user clicks the upload button
        tmpFilePath = Server.MapPath("~/App_Data/Uploads/Pictures");
        if (file == null || file.ContentLength == 0)
        {
            // No file was provided...show validation errors or something
        }
        filename = Path.GetFileName(file.FileName);
        path = Path.Combine(tmpFilePath, filename);
        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
        }
        file.SaveAs(path);
        if (Request.QueryString["oauth_verifier"] != null && Session["RequestToken"] != null)
        {
            // Flickr relevant code...
            string photoId = flickr.UploadPicture(path, "Test picture");
        }
        else
        {
            // Flickr relevant code...
            string url = flickr.OAuthCalculateAuthorizationUrl(token.Token, AuthLevel.Write);
            Response.Redirect(url);
        }
        return View("Test");
    }
}