Asp.net mvc 4 登录页面仅重定向回裸partialview
我使用jQueryAjax调用(获取)一个动作,该动作呈现用于创建(输入)新产品的partialview。此partialview的内容插入到具有基本布局的完整页面中的vid标记中。下面是ajax代码:Asp.net mvc 4 登录页面仅重定向回裸partialview,asp.net-mvc-4,url,asp.net-mvc-partialview,Asp.net Mvc 4,Url,Asp.net Mvc Partialview,我使用jQueryAjax调用(获取)一个动作,该动作呈现用于创建(输入)新产品的partialview。此partialview的内容插入到具有基本布局的完整页面中的vid标记中。下面是ajax代码: $("#Create").on('click', function (e) { //debugger; e.preventDefault(); $.ajax({ type: "GET", data: { re
$("#Create").on('click', function (e) {
//debugger;
e.preventDefault();
$.ajax({
type: "GET",
data: { returnUrl: String(window.location) }, <-- passing in the Url
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
});
})
.....
<div id="group-list">
@Html.Partial("PagedGroupList")
</div>
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
现在,若我在点击创建按钮之前先登录,一切都会如预期的那个样好。问题是单击“创建”按钮时没有先登录。由于[Authorize],登录页面将排在第一位,在登录之后,它将一起重定向回完整页面内的我的CREATE partialview。问题是登录页面重定向回裸create partialview,而不包含其父视图的任何元素。如果创建页面不是partialview,则登录页面将重定向回完整页面
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
我使用MVC4 defafult登录。我试图将登录页面变成ajax表单submit,并使用OnSuccess在登录页面和创建partialview中调用document.location,但我发现这是partialview的returnUrl问题。我还尝试了Request.urlReferer.AbsoluteUri,但它给出的URL与“/CreateGroup/CreateGroup?returnUrl=http%3A%2F%2Fwww.dev.com%3A22531%2F”或完整URL相同:。如果将Url放入浏览器,它也会显示纯partialview
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
我相信我一定错过了一些明显的东西,因为这应该是一个常见的场景,但我在谷歌上找不到任何线索。是否有一个URL可以在其父视图中同时显示partialview?如果没有,那么是否可以从partialview重定向回以前的视图
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
看起来没有包含其主机页的partialview的URL。目前我能想到的解决方案是让登录重定向到主机页,并在Model或viewbag或session temp中传入partialview名称,以再次呈现包含正确partialview的整个页面。以下是我解决此问题的方法。我觉得不太舒服。如果有人有更好的解决方案,请帮助
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
我在LoginModel中添加了两个字符串变量:公共字符串RetUrl{get;set;} 公共字符串URLreferer{get;set;}
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
在获取登录操作中:
public PartialViewResult Login(string returnUrl)
{
ViewBag.ReturnUrl = Request.UrlReferrer.AbsolutePath;
LoginModel lgm = new LoginModel();
lgm.UrlReferrer = Request.UrlReferrer.AbsoluteUri;
lgm.RetUrl = returnUrl;
return PartialView(lgm);
}
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
在登录后操作中:
// GET: /Create/
[Authorize]
public PartialViewResult CreateGroup(string returnUrl)
{
ViewBag.ReturnUrl = returnUrl;
CreateGroupModel cgm = new CreateGroupModel();
cgm.ReturnUrl = returnUrl;
cgm.group = new Static_Group();
return PartialView("CreateGroup", cgm);
}
public ActionResult Login(LoginModel model, string returnUrl)
{
if (ModelState.IsValid)
{
if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))
{
model.IsLoggedIn = true;
if (string.IsNullOrEmpty(model.RetUrl))
{
model.RetUrl = Url.Action("Index", "Home");
}
}
else
{
// If we got this far, something failed, redisplay form
ModelState.AddModelError("", "The user name or password provided is incorrect.");
}
}
return PartialView("Login", model);
}
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
在Login.cshtml中:放置两个隐藏字段以保留模型预设值:
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}
在ajax OnSuccess事件处理程序中,将CallPartial querystring追加到returnUrl的末尾,并重定向到此returnUrl:
@Html.HiddenFor(m => m.RetUrl)
@Html.HiddenFor(m => m.UrlReferrer)
<script type="text/javascript">
function logInComplete() {
//debugger;
if ('@Model.IsLoggedIn' == 'True' && '@Model.UrlReferrer' != '') {
//debugger;
var returnUrl = '@Model.UrlReferrer';
if ('@Model.RetUrl' != '@Model.UrlReferrer') {
if (returnUrl.indexOf('?') == -1) {
returnUrl = returnUrl + "?CallPartial=True";
}
else {
returnUrl = returnUrl + "&CallPartial=True";
}
}
document.location = returnUrl;
}
}
$('.ifCallPartial').each(function () {
//debugger;
if ('@Request["CallPartial"]' == "True") {
$(document).ready(function () {
CallCreate();
});
}
});
function CallCreate() {
//debugger;
//e.preventDefault();
var returl = String(window.location);
var n = returl.indexOf("?CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
else {
n = returl.indexOf("CallPartial");
if (n >= 1) {
returl = returl.substring(0, n);
}
}
$.ajax({
type: "GET",
data: { returnUrl: returl },
url: "/CreateGroup/CreateGroup",
dataType: 'html',
success: function (data) {
$("#group-list").html(data);
},
error: function (xhr, status, error) {
alert(error);
}
});
}