我在mvc中使用RedirectToAction方法时遇到问题。我的地图路线看起来像这样。
routes.MapRoute(
"Project", // Route name
"{Controller}/{Action}/{projectId}/{machineName}/{companyId}",
new { controller = "Project", action = "Directives", projectId = 0, machineName = "", companyId = 0 } // Parameter defaults);
回报看起来像这样:
return RedirectToAction("Directives", "Project", new { projectId = projectId, machineName = project.MachineName, CompanyId = user.Company_Id });
它工作正常,但我使用RedirectToAction它仍然看起来像这样
http://localhost:1843/Project/Directives?projectId=48&machineName=Netduino&companyId=27
控制器:
[HttpPost]
[ValidateInput(false)]
public ActionResult Create(Project project, string text)
{
ViewBag.MachineType = new List<string>(new string[] { "Machine Type A", "Machine Type B", "Machine Type C", "Machine Type D", "Machine Type E" });
if (ModelState.IsValid)
{
UserAccess user = (UserAccess)(Session["UserAccessInfo"]);
Int64 projectId = DataBase.DBProject.InsertProject(project.ProjectNumber, project.MachineName, project.MachineNameEnglish, 1, project.Serial, text, user.Company_Id,project.MachineType);
return RedirectToAction ("Directives", "Project", new { projectId = 48, machineName = "Netduino", companyId = 27 });
// return RedirectToAction("Directives", "Project", new { projectId = projectId, machineName = project.MachineName, CompanyId = user.Company_Id });
}
else
{
ModelState.AddModelError("", "Invalid username or password");
}
return View();
}
接收控制器:
public ActionResult Directives(int projectId, string machineName, int companyId)
{
convertedDirectives = new List<Models.Directives>();
ViewBag.MachineName = machineName;
ViewBag.ProjectId = projectId;
List<object> Directives = new List<object>();
if (ModelState.IsValid)
{
Directives = DataBase.DBProject.GetDirectives(companyId);
foreach (List<object> dir in Directives)
{
Directives newDirective = new Models.Directives();
newDirective.CompanyID = Convert.ToInt32(dir[0]);
newDirective.DirectiveId = Convert.ToInt32(dir[1]);
newDirective.Id = Convert.ToInt32(dir[2]);
newDirective.DirectiveName = Convert.ToString(dir[3]);
newDirective.DirectiveNameShort = Convert.ToString(dir[4]);
newDirective.Created = Convert.ToDateTime(dir[5]);
convertedDirectives.Add(newDirective);
}
}
else
{
ModelState.AddModelError("", "An error has ");
}
ViewBag.DirectivesList = convertedDirectives;
return View();
}
但我想要的方式是这样的。
http://localhost:1843/Project/Directives/48/Netduino/27
但奇怪的是,我可以手动输入Url并且它可以完美运行。我做错了什么?
答案 0 :(得分:4)
我有一些提示。
首先,不要为您的路线命名。将null传递给第一个参数。有几个RedirectToRoute重载采用路由名称,RedirectToAction返回RedirectToRouteResult。
其次,不要给出所需参数的默认值。如果您想要默认值,请仅将默认值设置为最后一个参数。
routes.MapRoute(null, // don't name the route
"{controller}/{action}/{projectId}/{machineName}/{companyId}",
new
{
controller = "Project",
action = "Directives",
//projectId = 0,
//machineName = "",
//companyId = 0,
}
);
第三,如有疑问,请尝试返回RedirectToRoute。传递控制器,动作和区域(如果适用)以及其他参数:
return RedirectToRoute(new
{
controller = "Project",
action = "Directives",
// area = "SomeAreaName", // if the action is in an area
projectId = projectId,
machineName = project.MachineName,
companyId = user.Company_Id,
});
最后一个提示是使用T4MVC摆脱那些神奇的字符串。
routes.MapRoute(null, // don't name the route
"{controller}/{action}/{projectId}/{machineName}/{companyId}",
new
{
controller = MVC.Project.Name,
action = MVC.Project.ActionNames.Directives,
}
);
您可以在RedirectToRoute中使用相同的强类型,或者您可以使用T4MVC部分来返回操作:
return RedirectToAction(MVC.Project.Directives
(projectId, project.MachineName, user.Company_Id));
答案 1 :(得分:0)
当我测试你的路线和RedirectToAction()时,当我将匿名对象中“CompanyId”属性的大小写更改为“companyId”时,它可以正常工作。
return RedirectToAction("Directives", "Project", new { projectId = 48, machineName = "Netduino", companyId = 27 });
更新: 以下是global.asax,Controllers和View中的代码。
routes.MapRoute(
"Project", // Route name
"{Controller}/{Action}/{projectId}/{machineName}/{companyId}",
new { controller = "Project", action = "Directives", projectId = 0, machineName = "", companyId = 0 } // Parameter defaults
);
public class HomeController : Controller
{
public ActionResult Index()
{
return RedirectToAction("Directives", "Project", new { projectId = 48, machineName = "Netduino", companyId = 27 });
}
}
public class ProjectController : Controller
{
public ActionResult Directives(int projectId, string machineName, int companyId)
{
ViewBag.ProjectId = projectId;
ViewBag.MachineName = machineName;
ViewBag.CompanyId = companyId;
return View();
}
}
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Directives
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2>
Directives</h2>
<%: ViewBag.ProjectId %><br />
<%: ViewBag.MachineName %><br />
<%: ViewBag.CompanyId %><br />
<%: this.Request.RawUrl %>
</asp:Content>