2010-06-03 76 views
1

仍然让我的双脚湿与asp.net mvc。我有一个可行的Action和httppost动作,但我想用RedirectToAction调用替换“iffy”代码,因为代码对于它的功能相当大。使用RedirectToAction的呼叫会清除更多。我尝试过的每种方式都无法为我工作,因为下拉列表无法选择正确的项目。下面的代码工作正常,但以我一直以来的方式调用RedirectToAction并不适合我。那么我该如何重写下面的代码才能使用RedirectToAction?RedirectToAction帮助:或更好的建议

我觉得这行代码特别麻烦,因为不担心“this.Url.RequestContext.RouteData.Route”属性的类型是“System.Web.Routing.Route”。

 
    // get url request 
      var urlValue = "/" + ((System.Web.Routing.Route)(this.Url.RequestContext.RouteData.Route)).Url; 

我也找到了第二块代码,而臃肿......

 
    // build the url template 
      urlValue = urlValue.Replace("{realm}", realm); 
      urlValue = urlValue.Replace("{guild}", guild); 
      urlValue = urlValue.Replace("{date}", date.ToShortDateString().Replace("/", "-")); 
      urlValue = urlValue.Replace("{pageIndex}", pageIndex.ToString()); 
      urlValue = urlValue.Replace("{itemCount}", itemCountToDisplay.ToString()); 

我的设置是

 
    routes.MapRoute(
      "GuildOverview Realm", // Route name 
      "GuildMembers/{realm}/{guild}/{date}/{pageIndex}/{itemCount}", // URL with parameters 
      new { controller = "GuildMembers", action = "Index" }); // Parameter defaults 

的代码为我的控制器操作的路径如下.. 。

[HttpPost] 
    public ActionResult Index(string realm, string guild, DateTime date, int pageIndex, int itemCount, FormCollection formCollection) 
    { 
     // get form data if it's there and try parse num items to display 
     var cnt = this.Request.Form["ddlDisplayCount"]; 
     int itemCountToDisplay = 10; 
     if (!string.IsNullOrEmpty(cnt)) int.TryParse(cnt, out itemCountToDisplay); 

     // get url request 
     var urlValue = "/" + ((System.Web.Routing.Route)(this.Url.RequestContext.RouteData.Route)).Url; 

     // build the url template 
     urlValue = urlValue.Replace("{realm}", realm); 
     urlValue = urlValue.Replace("{guild}", guild); 
     urlValue = urlValue.Replace("{date}", date.ToShortDateString().Replace("/", "-")); 
     urlValue = urlValue.Replace("{pageIndex}", pageIndex.ToString()); 
     urlValue = urlValue.Replace("{itemCount}", itemCountToDisplay.ToString()); 

     return this.Redirect(urlValue); 
    } 

    public ActionResult Index(string realm, string guild, DateTime date, int pageIndex, int itemCount) 
    { 
     // get the page index 
     ViewData["pageIndex"] = pageIndex; 

     // validate item count 
     var pageItemCountItems = new[] { 10, 20, 50, 100 }; 
     if (!pageItemCountItems.Contains(itemCount)) itemCount = pageItemCountItems[0]; 

     // calc the number of pages there are 
     var numPages = (this._repository.GetGuildMemberCount(date, realm, guild)/itemCount) + 1; 
     this.ViewData["pageCount"] = numPages; 

     // get url request 
     var urlValue = "/" + ((System.Web.Routing.Route)(this.Url.RequestContext.RouteData.Route)).Url; 

     // build the url template 
     urlValue = urlValue.Replace("{realm}", realm); 
     urlValue = urlValue.Replace("{guild}", guild); 
     urlValue = urlValue.Replace("{date}", date.ToShortDateString().Replace("/", "-")); 
     urlValue = urlValue.Replace("{pageIndex}", "{0}"); 
     urlValue = urlValue.Replace("{itemCount}", itemCount.ToString()); 

     // set url template 
     ViewData["UrlTemplate"] = urlValue; 

     // set list of items for the display count dropdown 
     var itemCounts = new SelectList(pageItemCountItems, itemCount); 
     ViewData["DisplayCount"] = itemCounts; 

     return View(_repository.GetGuildCharacters(date, realm, guild, (pageIndex - 1) * itemCount, itemCount)); 
    } 

an d我的索引视图包含休耕

  <%=Html.SimplePager(int.Parse(ViewData["pageIndex"].ToString()), 
            int.Parse(ViewData["pageCount"].ToString()), 
            ViewData["urlTemplate"].ToString(), 
            "nav-menu")%> 
      <% using (Html.BeginForm()) 
       { %> 
      <%= Html.DropDownList("ddlDisplayCount", (SelectList)ViewData["DisplayCount"], new { onchange = "this.form.submit();" })%> 
      <% }%> 

回答

0

您可以使用重定向到行动,你的情况是这样的:

return RedirectToAction("Index", new {realm = realm, guild = guild, 
             date = date, pageIndex = 0, 
             itemCount = itemCount}) ; 

DropDownList中选择的失败不是由于你的路线,但因为ViewData的只存在于当前请求。您应该使用TempData来代替。参见:ASP.NET MVC: return Redirect and ViewData