public ActionResult Index(int? page, string sortOrder)
{
ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "Name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "Date_desc" : "Date";
ViewBag.Total = ViewBag.AllCash = 0;
db.Users.ToList().ForEach(x => ViewBag.AllCash += (x.Score * 100) + x.Cash);
var UserHasCash = db.Users.Where(x => x.Cash != null && x.Cash > 0).Select(x => new CashViewModel
{
ID = x.ID,
Name = x.Name,
PhoneNumber = x.PhoneNumber,
Cash = x.Cash.Value,
Pay = false
}).ToList();
UserHasCash.ForEach(x => ViewBag.Total += x.Cash);
var pageNumber = page ?? 1; // if no page was specified in the querystring, default to the first page (1)
var onePageOfUser = UserHasCash.ToPagedList(pageNumber, 5); // will only contain 25 products max because of the pageSize
return View(onePageOfUser);
}
[HttpPost]
public async Task<ActionResult> Index(List<CashViewModel> PayList)
{
if (Request.Form["btnPayed"] != null)
{
var payedIds = PayList.Where(x => x.Pay).Select(x => x.ID).ToList();
db.Users.Where(x => payedIds.Contains(x.ID)).ToList().ForEach(x => x.Cash = 0);
List<Payed> pl = new List<Payed>();
foreach (var item in payedIds)
{
Payed p = new Payed()
{
UserID_FK = item,
User = db.Users.Where(x => x.ID == item).FirstOrDefault(),
Amount = PayList.Where(x => x.ID == item).FirstOrDefault().Cash,
Date = DateTime.Now
};
pl.Add(p);
db.Payeds.Add(p);
}
await db.SaveChangesAsync();
PersianCalendar pc = new PersianCalendar();
ExportToExcel(pl.Select(x => new {
ID = x.User.ID,
Name = x.User.Name,
Cash = x.Amount,
Date = new DateTime(pc.GetYear(x.Date), pc.GetMonth(x.Date), pc.GetDayOfMonth(x.Date)).ToString("yyyy/MM/dd").Replace("-","/")
}).ToList());
PayList.RemoveAll(x => x.Pay);
}
return RedirectToAction("Index", new RouteValueDictionary(new {page = (int?)1, sortOrder = "" }));
//RedirectToAction("Index", new RouteValueDictionary(new { controller = "Cash", action = "Index", page = (int?)1, sortOrder = "" }));// (PayList.ToPagedList(1,25));
}
Veiw:
@using (Html.BeginForm("Index", "Cash", FormMethod.Post, new { @class = "form-horizontal", @style = "direction: rtl;", role = "form" })) { <table class="table text-center pre-scrollable text-right" style="direction:rtl;"> <thead> <tr> <th></th> <th class="text-center"> کد </th> <th class="text-center"> @Html.ActionLink("نام", "Index", new { sortOrder = ViewBag.NameSortParm }) </th> <th class="text-center"> شماره تماس </th> <th class="text-center"> میزان وجه نقد(تومان) </th> </tr> </thead> @for (int i = 0; i < Model.Count; i++) { <tr class="text-center"> <td> @Html.CheckBoxFor(model => model[i].Pay) </td> <td> @Html.DisplayFor(model => model[i].ID) @Html.HiddenFor(model => model[i].ID) </td> <td> @Html.DisplayFor(model => model[i].Name) @Html.HiddenFor(model => model[i].Name) </td> <td> @Html.DisplayFor(model => model[i].PhoneNumber) @Html.HiddenFor(model => model[i].PhoneNumber) </td> <td> @(Model[i].Cash.ToString("###,0")) تومان @Html.HiddenFor(model => model[i].Cash) </td> </tr> } </table> <hr /> @Html.PagedListPager(Model, page => Url.Action("index", new { page })) <div>جمع کل : @((ViewBag.total).ToString("###,0")) تومان</div> <div>هزینه کل : @((ViewBag.AllCash).ToString("###,0")) تومان</div> <hr /> <input type="submit" value="پرداخت" name="btnPayed" class="btn btn-success" /> }
بعد از اینکه فرم submit می شود فرم ریدارکت نمی شود و هیچ Error یا Exception هم نمی دهد.
مشکل کجاست ؟؟؟؟؟؟
return RedirectToAction("Index", new RouteValueDictionary(new {page = (int?)1, sortOrder = "" }));
به Action Index مربوطه بعد از دستور فوق نمی رود و page ریداریکت نمی شود و model برای view دوباره ساخته نمی شود.
از دستور Return Redirect استفاده کنید و Url را بخ صورت دستی و رشته بسازید و ارسال کنید
متوجه شدم چرا Redirect صورت نمی گیرد در تابع EXportToExcel یک فایل Excel برای کاربر ارسال می شود و Response جاری تمام می شود:
public void ExportToExcel(IEnumerable<object> model) { var gv = new GridView(); gv.DataSource = model; gv.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=DemoExcel.xls"); Response.ContentType = "application/ms-excel"; Response.ContentEncoding = Encoding.UTF8; Response.Charset = "utf-8"; StringWriter objStringWriter = new StringWriter(); HtmlTextWriter objHtmlTextWriter = new HtmlTextWriter(objStringWriter); gv.RenderControl(objHtmlTextWriter); var data = Encoding.UTF8.GetBytes(objStringWriter.ToString()); var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray(); Response.OutputStream.Write(result, 0, result.Count()); Response.Flush(); Response.End(); //return File(result, "application/csv", "foo.csv"); }
وقتی دستور Redirect هم در انتهای ExportToExcel قرار می دهم فایل برای کاربر ارسال نمی شود.
شما اکشن را Void قرار دادید بعد دارید File خروجی مییدید
باید خروجی اکشن FileResult باشه
اگه توجه کنین این خط (//return File(result, "application/csv", "foo.csv");) کامنت شده، من الان میخوام هم فایل برای کاربر ارسال بشه و هم اینکه Actioin Index یک بار دیگه اجرا بشه.
من اصلا متوجه نمیشم
return که کامنت کردید درسته و باید فایل را برگردونه و از همین اکشن استفاده کنید
مشکل شما در ارسال ورودی اکشن هست و باید اون مشکل رو برطرف کنید
//view @Html.ActionLink("Export to Excel", "Excel") //controller Action public void Excel() { var model = db.GetModel() Export export = new Export(); export.ToExcel(Response, model); } //helper class public class Export { public void ToExcel(HttpResponseBase Response, object clientsList) { var grid = new System.Web.UI.WebControls.GridView(); grid.DataSource = clientsList; grid.DataBind(); Response.ClearContent(); Response.AddHeader("content-disposition", "attachment; filename=FileName.xls"); Response.ContentType = "application/excel"; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); grid.RenderControl(htw); Response.Write(sw.ToString()); Response.End(); } }
نه خیر مشکل چیز دیگه ای، چون ما در انتهای Export کردن فایل Response جاری و End می کنیم عمل Redirect صورت نمی گبرد، در واقع در هر Response یا می شود فایل را Export کرد یا Redirect صورت گیرد و هر دو همزمان امکان پذیر نیست.
Each HTTP request can only have one response - you're trying to sneak in two (the file, and a page).
http://stackoverflow.com/questions/13065697/redirect-show-view-after-generated-file-is-dowloaded
هیچ کاربری تا کنون از این پست تشکر نکرده است
با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)