从控制器ASP.NET MVC返回视图时调用jquery代码
我有一个MVC应用程序,希望在从控制器返回视图时启动jquery代码 这是我在我的_Layout.cshtml中的jquery行(我只希望在控制器调用时执行此代码,而不是在页面加载时执行,我需要某种函数??) 这可能吗?解决这个问题的最好办法是什么 请求的代码: UserAccount.cs从控制器ASP.NET MVC返回视图时调用jquery代码,jquery,asp.net,asp.net-mvc,Jquery,Asp.net,Asp.net Mvc,我有一个MVC应用程序,希望在从控制器返回视图时启动jquery代码 这是我在我的_Layout.cshtml中的jquery行(我只希望在控制器调用时执行此代码,而不是在页面加载时执行,我需要某种函数??) 这可能吗?解决这个问题的最好办法是什么 请求的代码: UserAccount.cs namespace ProfessionalDev.Models { public class UserAccount { [Required(ErrorMessage =
namespace ProfessionalDev.Models
{
public class UserAccount
{
[Required(ErrorMessage = "Required Field")]
public string email { get; set; }
[Required(ErrorMessage = "Required Field")]
public string password { get; set; }
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string LastName { get; set; }
public bool AddOpenClass { get; set; }
public UserAccount() { }
}
}
HomeController.cs
[HttpPost]
public ActionResult Index(UserAccount user)
{
if (ModelState.IsValid)
{
//Authenticate User
//User Failed to Authenticate
user.AddOpenClass = true;
TempData["alert"] = "alert-danger";
TempData["error"] = "Email or Password Incorrect";
}
user.AddOpenClass = true;
return View(user);
}
_Layout.cshtml
@model ProfessionalDev.Models.UserAccount
<!DOCTYPE html>
<html>
<head>
...
<ul class="nav navbar-nav navbar-right">
<li><a href="#">New User</a></li>
<li class="dropdown" id="drpdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Log In <span class="caret"></span></a>
<ul class="dropdown-menu">
<li>
@Html.Partial("_Errors")
@using (Html.BeginForm("Index", "Home", FormMethod.Post))
{
@Html.ValidationMessageFor(model => model.email)
@Html.TextBoxFor(model => model.email, new { @class = "form-control", @placeholder = "Email" })
@Html.ValidationMessageFor(model => model.password)
@Html.PasswordFor(model => model.password, new { @class = "form-control", @placeholder = "Password" })
<input type="submit" value="Submit" class="btn btn-primary" />
}
</li>
<li role="separator" class="divider"></li>
<li><a href="#">Forgot Password?</a></li>
</ul>
</li>
</ul>
...
@if (Model.AddOpenClass)
{
<script>
$(function(){
$("#drpdown").addClass("open");
});
</script>
}
</body>
</html>
@model ProfessionalDev.Models.UserAccount
...
-
-
@Html.Partial(“\u错误”)
@使用(Html.BeginForm(“Index”,“Home”,FormMethod.Post))
{
@Html.ValidationMessageFor(model=>model.email)
@TextBoxFor(model=>model.email,新的{@class=“form control”,@placeholder=“email”})
@Html.ValidationMessageFor(model=>model.password)
@Html.PasswordFor(model=>model.password,新的{@class=“form control”,@placeholder=“password”})
}
...
@if(Model.AddOpenClass)
{
$(函数(){
$(“#drpdown”).addClass(“打开”);
});
}
在操作方法中,将变量设置为ViewBag,您可以在布局页面中访问该变量,并根据需要执行JS
[HttpPost]
public ActionResult Index(UserAccount user)
{
ViewBag.ShouldExecuteJs = true;
if (ModelState.IsValid)
{
//Authenticate User
...
//User Failed to Authenticate
...
return View(user); //**FIRE UP JQUERY**
}
return View(user); //**FIRE UP JQUERY**
}
在Layout中,读取该值并使用该值确定是否要执行js代码
<script type="text/javascript">
$(function(){
var shouldExecuteJs="@ViewBag.ShouldExecuteJs";
if(shouldExecuteJs)
{
$("#drpdown").addClass("open");
}
});
</script>
$(函数(){
var shouldExecuteJs=“@ViewBag.shouldExecuteJs”;
如果(应执行)
{
$(“#drpdown”).addClass(“打开”);
}
});
您应该将返回到视图的属性添加到用户模型中。这是一种比使用viewbag、tempdata等更好的方法,因为它允许您拥有强类型模型
[HttpPost]
public ActionResult Index(UserAccount user)
{
if (ModelState.IsValid)
{
//User Failed to Authenticate
if(auth.failed)
{
//You might have a property specifically for authentication like this:
user.failedToAuthenticate = true;
// Or you could have a generic error message property that you display when not null
user.errorMessage = "Authentication Failed!";
return View(user);
}
}
}
然后在您看来
@if(Model.failedToAuthenticate)
{
// Fire your jQuery
<div class="alert-danger">@Model.errorMessage</div>
}
or
@if(!string.IsNullorEmpty(Model.errorMessage))
{
//Display error message
}
@if(Model.failedToAuthenticate)
{
//启动jQuery
@Model.errorMessage
}
或
@如果(!string.IsNullorEmpty(Model.errorMessage))
{
//显示错误消息
}
“当从控制器返回视图时”-还有什么方法?我将属性添加到我的模型中,就像Igor的回答一样,但是给了我对象引用,没有设置为对象的实例。
。我可能在某个地方遗漏了一些东西,但不确定有问题的代码可能是什么。错误在这里@if(Model.AddOpenClass)
您的问题可能在于您正在执行_layout.cshtml中的逻辑,但您的控制器实际上正在将模型返回到另一个视图。如果是这样的话,您将得到null ref异常,因为用户模型不在范围内。啊,好吧,可能就是这样。非常感谢。另外,尽量不要像那样使用Viewbag或Tempdata。更好的做法是在模型上创建user.errorMessage属性。我也会尝试在您的视图中保留css样式/类,我已经更新了我的示例来演示如何
[HttpPost]
public ActionResult Index(UserAccount user)
{
if (ModelState.IsValid)
{
//User Failed to Authenticate
if(auth.failed)
{
//You might have a property specifically for authentication like this:
user.failedToAuthenticate = true;
// Or you could have a generic error message property that you display when not null
user.errorMessage = "Authentication Failed!";
return View(user);
}
}
}
@if(Model.failedToAuthenticate)
{
// Fire your jQuery
<div class="alert-danger">@Model.errorMessage</div>
}
or
@if(!string.IsNullorEmpty(Model.errorMessage))
{
//Display error message
}