为什么不在正确的位置查找视图

时间:2012-11-07 13:27:42

标签: c# asp.net-mvc asp.net-mvc-2

我是一名MVC新手,所以这可能听起来微不足道。我在视图中名为LoginForm的文件夹中有我的2个视图(EnterLogin.aspx,ShowLogin.aspx)。 这是我下面的Global.asax.cs

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "LoginForm", action = "ShowLogin", id = UrlParameter.Optional } // Parameter defaults
        );
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterRoutes(RouteTable.Routes);
    }
}

这是我的ShowLogin.aspx设计代码

<form method="post" action="EnterLogin" runat="server">
    Hello, i'm login page
    Enter Name   <asp:TextBox ID="txtName" runat="server"></asp:TextBox>
    <input type="submit" value="PressMe" />
</form>

这是我的控制器

public class LoginFormController : Controller
{
    public ActionResult ShowLogin()
    {
        return View();
    }

    public ActionResult EnterLogin()
    {
        return View("EnterLogin");
    }
}

在运行应用程序时,首先使用url加载

http://localhost:50224/

并显示ShowLogin.aspx视图

点击按钮我正在呼叫EnterLogin控制器以显示EnterLogin视图,但它在网址中显示

http://localhost:50224/EnterLogin

而不是

http://localhost:50224/LoginForm/EnterLogin

导致这种情况的原因是什么?

3 个答案:

答案 0 :(得分:1)

您未登陆的原因是表单的action部分:

action="EnterLogin"

这应该遵循正确的路线以确保它达到LoginFormController。 e.g。

action="/LoginForm/EnterLogin"

请记住,传入的请求需要与RegisterRoutes中指定的路由匹配。由于您没有与EnterLogin直接匹配的内容,因此会尝试使用EnterLogin填充{controller},然后默认为ShowLogin作为操作(导致请求失败) )。基本上是:

EnterLogin  ==resolves==>  EnterLogin  /ShowLogin/
                           {controller}/{action} /{id}

或者你可以制作一个命名路线,如果你想短信,它会重定向到正确的位置:

action="LogMeIn"

然后:

routes.MapRoute(
    "Login",
    "LogMeIn",
    new { controller = "LoginForm", action = "EnterLogin" }
);

现在请求/LogMeIn将执行LoginForm的{​​{1}}操作。

答案 1 :(得分:0)

Global.asax中定义的默认路由定义了具有/ controller / action的路由。

您的控制器名为LoginForm,您的操作称为EnterLogin,因此这是预期的行为。

如果要从URL中排除LoginForm,则需要定义一个自定义路由以允许此操作。

 routes.MapRoute(
        "LoginForm_EnterLogin", // Route name
        "LoginForm/EnterLogin/{id}", // URL with parameters
        new { controller = "LoginForm", action = "ShowLogin", id = UrlParameter.Optional } // Parameter defaults
    );

答案 2 :(得分:0)

你可能会做这样的事情

Global.asax.cs: -

  

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "LoginForm", action = "ShowLogin", id = UrlParameter.Optional } // Parameter defaults
    );

ShowLogin.aspx: -

 <form method="post" action="EnterLogin" runat="server">
     Hello, i'm login page
    Enter Name   <input type="text" name="txtName"/>
     <input type="submit" value="PressMe" /> </form>

LoginFormController: -

public class LoginFormController : Controller
{
    public ActionResult ShowLogin()
    {
        return View();
    }

    [HttpPost]
    public ActionResult EnterLogin(FormCollection collection)
    {
        string Yourtxtname=Collection["txtName"]; //You will get input text value

        return View();
    }
}