7

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を手動で入力できます。私は何が間違っているのですか?

4

2 に答える 2

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));
于 2012-05-11T20:50:18.767 に答える
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>
于 2012-05-11T14:39:15.940 に答える