ASP.NET MVC + modelstate and partial view

3
我有一个名为LogOn的部分视图,在其中我基本上将登录输入复制到一个控件中。我使用Html.RenderPartial将该控件放置在我的Index.Html中,放在一个Ajax.BeginForm中。
<div id="login_ajaxtarget">
   <% using (Ajax.BeginForm("Logon", "Account", new AjaxOptions { UpdateTargetId = "login_ajaxtarget", HttpMethod = "Post" })) { %>

       <% Html.RenderPartial("LogOn"); %>

   <% } %>
        </div> 

我正在尝试传递验证消息并将其显示出来,但似乎无法使其正常工作。我将模型传递给视图,但它似乎无法正确呈现验证。
我的控制器:
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
    {

        if (!ValidateLogOn(userName, password))
        {
            return PartialView("LogOn", ModelState);
            //return RedirectToAction("Index", "Home");
        }

        FormsAuth.SignIn(userName, rememberMe);
        if (!String.IsNullOrEmpty(returnUrl))
        {
            return Redirect(returnUrl);
        }
        else
        {
            return RedirectToAction("Index", "Home");
        }
    }

我的部分观点
<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>


        <div>
            <fieldset>
                <legend>Account Information</legend>
                <p>
                    <label for="username">Username:</label>
                    <%= Html.TextBox("username") %>
                    <%= Html.ValidationMessage("username") %>
                </p>
                <p>
                    <label for="password">Password:</label>
                    <%= Html.Password("password") %>
                    <%= Html.ValidationMessage("password") %>
                </p>
                <p>
                    <%= Html.CheckBox("rememberMe") %> <label class="inline" for="rememberMe">Remember me?</label>
                </p>
                <p>
                    <input type="submit" value="Log On" />
                </p>
            </fieldset>
        </div>

我正在尝试使用此线程中的建议(http://forums.asp.net/p/1398814/3023892.aspx#3023892),但我不确定这是否正确。我真正想要的是能够将LogOn功能放在主页上,而不必导航到新页面才能使用它。如果有更简单的方法,我会听取意见!先感谢您的帮助。
2个回答

0

我认为有些东西是必需的。您没有检查输入是否为空,也没有向模型状态添加任何错误消息。

// In your action add somethings like bellow.

if (String.IsNullOrEmpty(userName))
    this.ModelState.AddModelError("UserName", "The username is required.");

if (this.ModelState.IsValid)
{
    // Do login
}

return PartialView("Login");

抱歉,我添加的代码是到目前为止我已经更改过的代码。我已经实现了ValidateLogOn方法(更确切地说,它已经被我实现了)。我只是试图修改新建MVC项目时提供的开箱即用的网站模板。我的问题是,一旦错误被添加到模型中,它们就不会出现在页面上的验证消息中。 - jimbo

0

嘿,真的很抱歉。我没有看到默认的MVCApplication项目模板。

看看它可能会解决你的问题。

这个控件:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<script src="../../Scripts/MicrosoftAjax.js" type="text/javascript"></script>

<script src="../../Scripts/MicrosoftMvcAjax.js" type="text/javascript"></script>

<%= Html.ValidationSummary("Login was unsuccessful. Please correct the errors and try again.") %>
<% using (Ajax.BeginForm("LogOn", "Account", new AjaxOptions() { UpdateTargetId = "UpdatePanel" }))
   { %>
<div id="UpdatePanel">
    <fieldset>
        <legend>Account Information</legend>
        <p>
            <label for="username">
                Username:</label>
            <%= Html.TextBox("username") %>
            <%= Html.ValidationMessage("username") %>
        </p>
        <p>
            <label for="password">
                Password:</label>
            <%= Html.Password("password") %>
            <%= Html.ValidationMessage("password") %>
        </p>
        <p>
            <%= Html.CheckBox("rememberMe") %>
            <label class="inline" for="rememberMe">
                Remember me?</label>
        </p>
        <p>
            <input type="submit" value="Log On" />
        </p>
    </fieldset>
</div>
<% } %>

代码:

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult LogOn(string userName, string password, bool rememberMe, string returnUrl)
{

    if (!ValidateLogOn(userName, password))
    {
        return PartialView("Login");
    }

    FormsAuth.SignIn(userName, rememberMe);
    if (!String.IsNullOrEmpty(returnUrl))
    {
        return Redirect(returnUrl);
    }
    else
    {
        return RedirectToAction("Index", "Home");
    }
}

这对我有效。如果问题仍然存在,请使用Firebug检查响应和请求。

希望能帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接