如何使用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重定向了
回调最有可能使用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");
}
}