مرجع تخصصی برنامه نویسان

انجمن تخصصی برنامه نویسان فارسی زبان

کاربر سایت

mohsen6969

عضویت از 1394/11/20

Redirect page after submit

  • چهارشنبه 27 بهمن 1395
  • 16:59
تشکر میکنم

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 هم نمی دهد.

پاسخ های این پرسش

تعداد پاسخ ها : 8 پاسخ
کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • چهارشنبه 27 بهمن 1395
  • 18:23

مشکل کجاست ؟؟؟؟؟؟

کاربر سایت

mohsen6969

عضویت از 1394/11/20

  • پنجشنبه 28 بهمن 1395
  • 10:57
 return RedirectToAction("Index", new RouteValueDictionary(new {page = (int?)1, sortOrder = "" }));

به Action Index مربوطه بعد از دستور فوق نمی رود و page ریداریکت نمی شود و  model برای view دوباره ساخته نمی شود.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • پنجشنبه 28 بهمن 1395
  • 11:02

از دستور Return Redirect استفاده کنید و Url را بخ صورت دستی و رشته بسازید و ارسال کنید

کاربر سایت

mohsen6969

عضویت از 1394/11/20

  • پنجشنبه 28 بهمن 1395
  • 12:16

متوجه شدم چرا 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 قرار می دهم فایل برای کاربر ارسال نمی شود.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • پنجشنبه 28 بهمن 1395
  • 12:20

شما اکشن را Void قرار دادید بعد دارید File خروجی مییدید

باید خروجی اکشن FileResult باشه

کاربر سایت

mohsen6969

عضویت از 1394/11/20

  • پنجشنبه 28 بهمن 1395
  • 12:25

اگه توجه کنین این خط (//return File(result, "application/csv", "foo.csv");) کامنت شده، من الان میخوام هم فایل برای کاربر ارسال بشه و هم اینکه Actioin Index یک بار دیگه اجرا بشه.

کاربر سایت

ایمان مدائنی

عضویت از 1392/01/20

  • پنجشنبه 28 بهمن 1395
  • 12:29

من اصلا متوجه نمیشم

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();
    }
}

کاربر سایت

mohsen6969

عضویت از 1394/11/20

  • پنجشنبه 28 بهمن 1395
  • 12:45

نه خیر مشکل چیز دیگه ای، چون ما در انتهای 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

کاربرانی که از این پست تشکر کرده اند

هیچ کاربری تا کنون از این پست تشکر نکرده است

اگر نیاز به یک مشاور در زمینه طراحی سایت ، برنامه نویسی و بازاریابی الکترونیکی دارید

با ما تماس بگیرید تا در این مسیر همراهتان باشیم :)