【问题标题】:mvc4 how to make a function in controller with null able parametermvc4如何在具有空参数的控制器中创建一个函数
【发布时间】:2014-07-22 06:32:51
【问题描述】:

我有一个登录表单,如果用户输入正确的登录信息,他/她将进入我的网站。

但是,如果他/她输入的信息不正确,我想将他/她返回到他/她输入他/她的信息并已填写的字段的同一页面。

我的意思是,我想在他/她可以看到他/她在字段中输入的用户名和密码的页面上,而不是从零开始输入。

我试过了

public ActionResult(Login ?login = null){}

所以当我想显示带有 null 参数的登录页面时,我会调用此函数。当用户输入不正确的信息时,我会调用它。但是,我去例外

“Login”类型必须是不可为空的值类型,才能将其用作泛型类型或方法“System.Nullable”中的参数“T”

请你帮我解决这个问题?

如果有第二种解决方案,请告诉我,但请不要谈论会员和这些人,因为我有自己的方式来向用户保证

编辑

当用户按下登录按钮时,我会转到此控制器功能

public ActionResult Index()
        {
            return View();
        }

当他在登录页面提交他/她的表单时,我会转到此功能

public ActionResult Login(Login login) {}

我想在上面的login函数中,如果用户输入不正确的信息返回到他/她看到他/她提交的数据的index页面

【问题讨论】:

  • "Login" 似乎是一个类,所以它已经可以为空了
  • @jim login 是我在模型库中的模型类

标签: asp.net-mvc asp.net-mvc-4


【解决方案1】:

创建一个新的 MVC Internet 应用程序(一个 VS 模板)并查看“Model.IsValid”如何在控制器中使用。这是最常见的方法。当某个模型进入控制器时,您检查它是否有效(重定向到主页或其他),否则您只显示相同的视图,为它提供已经(部分)由用户填充的模型。
就是这个:

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    if (ModelState.IsValid)
    {
        // do things
        return RedirectToAction("Index", "Home");
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

模型错误可能在隐式模型绑定期间发生(例如,如果传入数据中不存在某些必需的属性)或使用 ModelState.AddModelError 在代码中显式设置。在页面上放置 html 验证器可以让用户知道对字段值应用了什么样的约束。

【讨论】:

  • 什么是returneURL?请问?
  • @user2208349 当您使用 FormAuthentication 机制(ASP.NET 集成)时,您在 web.config 文件中指定登录页面 url(搜索“loginUrl”字符串)。当匿名用户尝试打开只允许经过身份验证的用户的 url(请参阅“AuthorizationAttribute”)时,服务器会自动将用户重定向到指定的登录页面。默认情况下,它的 url 是 ~/Account/LogOn(参见 web.config),就 MVC 路由而言,这意味着帐户控制器,LogOn 操作。
  • @user2208349 ...重定向时,服务器还添加了一个额外的参数-returnUrl,因此您的控制器操作可以知道最初访问的页面Url,并且能够在成功登录的情况下将用户重定向回来。跨度>
  • 这完全不是我的问题,当用户输入不正确的信息时,我想返回登录页面,其中包含已输入的信息
  • +1 给你,我感谢你的帮助、支持和努力,真的很抱歉,因为我不能只选择一个答案,我真的非常非常非常非常非常感谢你,请原谅我不选择你的答案,我喜欢你
【解决方案2】:

你只需使用这个:

// [HttpPost] and any other attributes necessary
public ActionResult YourAction(Login login)
{
    ...
}

但考虑到您想要实现的逻辑的一般概念,我会说您不需要登录为空。

该操作只是做它做的事情:它处理登录(在客户端完成回发之后)。因此,它始终必须包含任何数据。

如果您想在对登录信息进行一些检查后重定向,您会收到它们,检查然后执行RedirectToAction(...) 或您想要的任何其他类型的重定向。

然后在视图中您将拥有(例如,对于索引操作):

@model Login

@using(Html.BeginForm("YourAction", "home"))
{
        @Html.LabelFor(model => model.UserName)
        @Html.TextBoxFor(model => model.UserName)
        @Html.ValidationMessageFor(model => model.UserName)

        @Html.LabelFor(model => model.Password)
        @Html.PasswordFor(model => model.Password)
        @Html.ValidationMessageFor(model => model.Password)

        <input type="submit" value="go"/>              
}

编辑:

想象一下你的 YourAction 是 Login:

[HttpGet]
public ActionResult Login()
{
    // this one is called on the first entering of login and shows the form to fill
    return View(new Login()); // for instance
}

[HttpPost]
public ActionResult Login(Login login)
{
    // this one is called on PostBack after filling the form and pressing 'Login' (or something) button
    // todo:  here you to validate the login info
    // and then either do your redirect to some other page or showing the login form again

    // if(something)
    //    return RedirectToAction(...);

    return View(login);
}

【讨论】:

  • 但是以你的方式,当用户第一次要求登录页面时,它会显示他的infroation不正确的错误消息
  • 登录页面必须使用其他操作创建:例如,[HttpPost]public ActionResult Login() 不带任何参数并用于 GET HTTP 方法。然后您呈现一些表单,它将回发发送到 YourAction(可能也是 Login one(另一种方法),但带有一个参数和一个 POST HTTP 方法)。
  • 在您的编辑答案中您说过这个either do your redirect to some other page or showing the login 那么我应该编写什么代码来重定向到包含已字段字段的我的页面?
  • 所有的majec都来自于将两个方法同名
  • 是的。并且不要忘记使用 Post/Get 规范属性来防止不同的负面情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多