【问题标题】:ASP MVC 3, how to set model properties in controller?ASP MVC 3,如何在控制器中设置模型属性?
【发布时间】:2011-12-16 16:01:05
【问题描述】:

我有一个带有提交公式 (Html.BeginForm()) 的视图,并且想在控制器中设置一些模型属性,返回视图,希望在查看。

这是我在标准 MVC 3 登录公式中的模式。

精度我真的想在 POST 处理中设置这些属性,而不是在 GET 中。

您能否解释一下为什么我在控制器中设置的属性从不显示在视图上?

 [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        model.RememberMe = true;
        model.UserName = "foobar";

        return View(model);
    }

使用类似于标准 LogOn.cshtml 的视图:

 @using (Html.BeginForm()) {
        <div>
            <fieldset>
                <legend>Account Information</legend>

                <div class="editor-label">
                    @Html.LabelFor(m => m.UserName)
                </div>
                <div class="editor-field">
                    @Html.TextBoxFor(m => m.UserName)
                    @Html.ValidationMessageFor(m => m.UserName)
                </div>

                <div class="editor-label">
                    @Html.LabelFor(m => m.Password)
                </div>
                <div class="editor-field">
                    @Html.PasswordFor(m => m.Password)
                    @Html.ValidationMessageFor(m => m.Password)
                </div>

                <div class="editor-label">
                    @Html.CheckBoxFor(m => m.RememberMe)
                    @Html.LabelFor(m => m.RememberMe)
                </div>

                <p>
                    <input type="submit" value="Log On" />
                </p>
            </fieldset>
        </div>
    }

【问题讨论】:

  • 你能告诉我,在查看它是否显示@Model.UserName吗??
  • 您确定正在调用您的登录操作吗?当 viw 第一次打开时,它不会点击动作的 [HttpPost] 版本。
  • @BenFinkel:是的,这就是我的想法……
  • 在初始加载时,它将响应 HTTP GET,而不是 POST。您的代码只有在发布时才会受到影响(如果出现错误并且您想重新显示视图,这会很好)。

标签: asp.net-mvc-3


【解决方案1】:

如果您想在 HttpPost Action 中使用,则必须按照以下方式进行。

[HttpPost]
public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        ModelState.Remove("RememberMe");
        ModelState.Remove("UserName");
        model.RememberMe = true;
        model.UserName = "foobar";
        return View(model);
    }

【讨论】:

  • 感谢 dotnetstep,正是我想做的。
【解决方案2】:

据我了解您的问题:将此操作添加到您的控制器

   /*no http post*/
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        model = model ?? new LogOnModel();
        model.RememberMe = true;
        model.UserName = "foobar";

        return View(model);
    }

根据你的评论

   [HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        ModelState.Clear();
        model.RememberMe = true;
        model.UserName = "foobar";

        return View(model);
    }

【讨论】:

  • 我的问题可能不够清楚:我想在帖子填写此属性,以便更新视图
  • 虽然你已经接受了一些其他的答案,但根据你的评论,我已经更新了我的答案。总有改进的余地。
【解决方案3】:

我认为您对 [HttpPost] 标志的作用感到困惑。当请求作为 POST 发送到服务器时,此属性将操作标识为要使用的操作。当您第一次查看页面时,浏览器的标准请求是 GET。您的 POST 操作应该是检查提交表单的凭据的操作。

[HttpGet]
public ActionResult LogOn(LogOnModel model, string returnUrl)
{
    model.RememberMe = true;
    model.UserName = "foobar";

    return View(model);
}

[HttpPost]
    public ActionResult LogOn(LogOnModel model, string returnUrl)
    {
        //Verify input here
    }

【讨论】:

  • 我的问题可能不够清楚:我想在帖子中填写此属性,以便更新视图
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2013-04-10
  • 2013-11-19
  • 1970-01-01
  • 2016-11-09
  • 2014-04-09
  • 2019-11-01
相关资源
最近更新 更多