两个控件的验证触发

时间:2011-12-09 11:10:24

标签: asp.net-mvc-3 validation razor

我目前在一个页面上有两个部分视图,添加了:

@Html.Action("_LogonBox","Account")
@Html.Action("_TrackingBox","Tracking")

每个都有自己的形式和模型......

但是如果我在_logonbox视图中输入值并提交它会导致验证在TrackingBox上触发,并且因为跟踪框中的值为空,它会将文本框突出显示为错误。

如何解决这个问题,在webforms中它只是validationGroups?

修改

这是标记:

登录查看

  @model Models.LogonModel
@using (Html.BeginForm("Login", "account", FormMethod.Post, new { Id = "Login" }))
    {
    <div class="boxwrapper">
        <div class="loginbox">
            <a href="#" style="float: right; color: #fff; font-size: 95%%; padding: 5px 10px;">Forgotten
                Password?</a>
            <h3>
                My Account</h3>
            <div class="content">
                <fieldset class="logincontrols">
                    <table>
                        <tr>
                            <td class="loginlabel">
                                 @Html.LabelFor(m => m.UserName)
                            </td>
                            <td class="logintextbox">
                                @Html.TextBoxFor(m => m.UserName, new { ValidationGroup = "Account" })
                            </td>
                        </tr>
                        <tr>
                            <td class="loginlabel">
                                @Html.LabelFor(m => m.Password)
                            </td>
                            <td class="logintextbox">
                                @Html.PasswordFor(m => m.Password, new { ValidationGroup = "Account" })&nbsp;
                                <input type="image" value="Sign In" src="/Content/Images/buttons/signin.png" style="vertical-align: bottom;" ValidationGroup="Account" />
                            </td>
                        </tr>
                    </table>
                </fieldset>
            </div>
        </div>
    </div>}

跟踪视图

@model .Models.TrackingModel

@using (Html.BeginForm("Index", "Tracking", new { Id = "Tracking" }))
{
<div class="boxwrapper">
    <div class="bluebox">
        <fieldset class="logincontrols">
        <h3>
            Shipment Tracking</h3>
        <div class="content">
            <p style="text-align: left;">
                &nbsp; &nbsp;Please enter your reference number:</p>
                 @Html.TextBoxFor(m => m.TrackingNumber)
            <br />
            <p style="text-align: right; margin-top: 10px;">
                <input type="image" value="Track Shipment" src="/Content/Images/buttons/trackingbutton.png" />&nbsp;&nbsp;</p>
        </div>
        <fieldset>
    </div>
</div>
}

进一步编辑 按要求添加了控制器

     public class TrackingController : Controller
        {
            //
            // GET: /Tracking/

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

            [HttpPost]
            public ActionResult Index(TrackingModel model)
            {
                return View(model);
            }

            [HttpPost]
            public PartialViewResult _TrackingBox(TrackingModel model)
            {
                return PartialView(model);
            }

            public PartialViewResult _TrackingBox()
            {
                return PartialView();
            }
        }


public class AccountController : Controller
    {
        public ActionResult Login()
        {

            return View();
        }

        [HttpPost]
        public ActionResult Login(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                if (Membership.ValidateUser(model.UserName, model.Password))
                {
                    FormsAuthentication.SetAuthCookie(model.UserName, false);
                    if (Url.IsLocalUrl(returnUrl) && returnUrl.Length > 1 && returnUrl.StartsWith("/")
                        && !returnUrl.StartsWith("//") && !returnUrl.StartsWith("/\\"))
                    {
                        return Redirect(returnUrl);
                    }
                    else
                    {
                        return RedirectToAction("Index", "Home");
                    }
                }
                else
                {
                    ModelState.AddModelError("", "The user name or password provided is incorrect.");
                }
            }

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

        public PartialViewResult _Logonbox()
        {
            return PartialView();
        }

        [HttpPost]
        public PartialViewResult _Logonbox(LogOnModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                //do something here
            }

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

    }

3 个答案:

答案 0 :(得分:1)

我已经成功解决了这个问题,但是如果有人可以评论为什么这会修复它会很棒。

我将@Html.Action("_partialViewName")更改为@Html.Partial("_partialViewName"),这导致了同样的问题。

要解决此问题,我必须包含一个新的模型对象,如下所示。

@Html.Partial("_LogonBox", new TGEFreight.UI.Web.Models.LogOnModel())
@Html.Partial("_TrackingBox", new TGEFreight.UI.Web.Models.TrackingModel())

至于为什么这个工作我不知道,这可能是由于我在MVC的初期,但无论如何这都是答案。

感谢帮助人员。

答案 1 :(得分:0)

我猜这两个字段集都包含在同一个<form>中。您可以通过为每个部分/子操作单独<form>来解决此问题。

与webforms不同,MVC可以让您充分利用HTML,这意味着您可以在页面上拥有多个表单。在webforms中,所有内容都需要位于1页面上,以便在每次回发期间可以为整个页面保留视图状态。

如果您使用的是jquery不显眼的验证,则只会针对提交的表单触发验证。

修改

对不起,我重新阅读了你的问题,你说每个问题都有自己的形式。你能展示更多的剃刀标记吗?你的提交按钮是什么样的?是否有任何附加到表单的jquery或javascript行为?是在客户端还是服务器上启动验证?

<强>更新

您是否尝试过使用@ Html.Partial代替@ Html.Action? Html.Action导致对子操作方法的新HTTP请求。您的帐户控制器上的登录操作返回什么视图?可能是登录POST将跟踪操作作为POST调用,并导致验证触发它。

答案 2 :(得分:0)

我同意@olivehour你应该尝试使用@ Html.Partial而不是@ Html.Action。现在当你说如果使用Partial而你无法定义它们要使用的动作时,你究竟是什么意思。您应该能够为每个部分定义HttpGet和HttpPost操作而不会出现问题,因此例如,您应该能够轻松地执行以下操作:

 public class AccountController : Controller
 {
      ...
      [HttpGet]
      public ActionResult Login()
      {
           return PartialView();
      }

      [HttpPost]
      public ActionResult Login(LoginModel model)
      {
          ... Validate Model & additional logic
          // return some redirect action
      }
 }

我注意到你在帖子中只是再次返回PartialView,那只是伪代码吗?如果没有,至少对于登录部分,我会假设如果有人登录,则后期操作会将它们重定向到另一个页面。在任何一种情况下,您都会在调用视图中使用@ Html.Partial或@ {Html.RenderPartial(...);}来显示部分视图。希望有所帮助。