我目前在一个页面上有两个部分视图,添加了:
@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" })
<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;">
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" /> </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);
}
}
答案 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(...);}来显示部分视图。希望有所帮助。